多对多关系中的最大值

ena*_*ash 5 sql sql-server join max

我正在使用SQL Server 2008,我有3个表x,yz.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.

另请注意,在我的实际情况中,我在结果集中需要的所有三个表中都有其他字段.

Rob*_*Day 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
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)