我使用的是SQL Server2008,我有3个表,x,y和z。y的存在是为了在x和z之间创建多对多关系。
x y z
-- -- --
id xid id
zid sort以上所有字段均为int。
我想找出性能最好的方法(不包括去规格化),找到任何z的sort最高的x,并返回所有三个表中的所有字段。
示例数据:
x: id
--
1
2
y: xid zid
--- ---
1 1
1 2
1 3
2 2
z: id sort
-- ----
1 5
2 10
3 25结果集应为
xid zid
--- ---
1 3
2 2请注意,如果存在多个具有相同最高sort值的z,那么我仍然希望每个x只有一行。
还请注意,在我的实际情况中,所有三个表中都有其他字段需要在我的结果集中使用。
发布于 2010-07-02 17:02:16
一种方法是使用子查询。但是,这只适用于获取Z的ID。如果需要来自x和z表的更多/所有列,那么这不是最好的解决方案。
SELECT
x.id,
(
SELECT TOP 1
z.zid
FROM
y
INNER JOIN
z
ON
z.id = y.zid
WHERE
y.xid = x.id
ORDER BY
z.sort DESC
)
FROM
x这就是如何执行此操作并返回所有表中的所有数据。
SELECT
*
FROM
x
INNER JOIN
y
ON
y.xid = x.id
AND
y.zid =
(
SELECT TOP 1
z2.zid
FROM
y y2
INNER JOIN
z z2
ON
z2.id = y2.zid
WHERE
y2.xid = x.id
ORDER BY
z2.sort DESC
)
INNER JOIN
z
ON
z.id = y.zid发布于 2010-07-02 16:58:33
select xid,max(zid) as zid from y
group by xid发布于 2010-07-02 17:34:55
select xid, zid /* columns from x; and columns from y or z taken from q */
from (select y.xid, y.zid, /* columns from y or z */
row_number() over(partition by y.xid order by z.sort desc) r
from y
join z on z.id = y.zid
) q
join x on x.id = q.xid
where r = 1https://stackoverflow.com/questions/3164328
复制相似问题