我正在使用SQL Server 2008,我有3个表,x
,y
和z
。存在y
以在x
和z
之间创建多对多关系。
x y z
-- -- --
id xid id
zid sort
以上所有字段均为int
。
我想找到性能最佳的方法(不包括非规范化),找出z
sort
的{{1}},并返回所有三个表中的所有字段。< / p>
示例数据:
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
值的z
,那么我仍然只需要每sort
行一行。
另请注意,在我的实际情况中,我在结果集中需要的所有三个表中都有其他字段。
答案 0 :(得分:0)
select xid,max(zid) as zid from y
group by xid
答案 1 :(得分:0)
一种方法是使用子查询。然而,这只适用于获取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
答案 2 :(得分:0)
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 = 1