ena*_*ash 5 sql sql-server join max
我正在使用SQL Server 2008,我有3个表x,y和z.y存在以创建x和之间的多对多关系z.
x y z
-- -- --
id xid id
zid sort
Run Code Online (Sandbox Code Playgroud)
以上所有领域都是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
Run Code Online (Sandbox Code Playgroud)
结果集应该是
xid zid
--- ---
1 3
2 2
Run Code Online (Sandbox Code Playgroud)
请注意,如果z存在多个具有相同最高sort值的值,那么我仍然只需要每行一行x.
另请注意,在我的实际情况中,我在结果集中需要的所有三个表中都有其他字段.
一种方法是使用子查询。然而,这仅适用于获取 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
Run Code Online (Sandbox Code Playgroud)
这就是您可以执行此操作并返回所有表中的所有数据的方法。
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
Run Code Online (Sandbox Code Playgroud)