代码之家  ›  专栏  ›  技术社区  ›  enashnash

多对多关系中的最大值

  •  5
  • enashnash  · 技术社区  · 15 年前

    我使用的是SQL Server 2008,有3个表, x , y z . z

     x      y      z
    --     --     --
    id    xid     id
          zid   sort
    

    以上所有字段都是 int .

    我想找到最好的执行方法(不包括反规范化)找到 最高的 sort 对于任何 ,并返回所有三个表中的所有字段。

    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 以相同的最高 分类 值,那么我仍然只希望每个

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

    3 回复  |  直到 15 年前
        1
  •  0
  •   Robin Day    15 年前

    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
  •   Madhivanan    15 年前
    select xid,max(zid) as zid from y
    group by xid
    
        3
  •  0
  •   araqnid    15 年前
    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