多对多关系中的最大值

时间:2010-07-02 08:54:11

标签: sql sql-server join max

我正在使用SQL Server 2008,我有3个表,xyz。存在y以在xz之间创建多对多关系。

 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行一行。

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

3 个答案:

答案 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