多对多关系中的最大值

发布于 2024-09-08 03:07:44 字数 810 浏览 5 评论 0原文

我使用的是 SQL Server 2008,有 3 个表:xyzy 的存在是为了在 xz 之间创建多对多关系。

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

上述所有字段都是int

我想找到针对任何 x 查找具有最高 sortz 的最佳执行方法(不包括反规范化),并返回所有字段来自所有三个表。

示例数据:

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

注意,如果存在多个具有相同最高 sort 值的 z,那么我仍然只希望每个 x 一行代码>.

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

I'm using SQL Server 2008 and I have 3 tables, x, y and z. y exists to create a many-to-many relationship between x and z.

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

All of the above fields are int.

I want to find the best-performing method (excluding denormalising) of finding the z with the highest sort for any x, and return all fields from all three tables.

Sample data:

x:   id
     --
      1
      2

y:  xid zid
    --- ---
      1   1
      1   2
      1   3
      2   2

z:  id sort
    -- ----
     1    5
     2   10
     3   25

Result set should be

xid zid
--- ---
  1   3
  2   2

Note that if more than one z exists with the same highest sort value, then I still only want one row per x.

Note also that in my real-world situation, there are other fields in all three tables which I will need in my result set.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

没︽人懂的悲伤 2024-09-15 03:07:44

一种方法是使用子查询。然而,这仅适用于获取 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

One method is with a sub query. This however is only good for getting the ID of Z. If you need more/all columns from both x and z tables then this is not the best solution.

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

This is how you can do it and return all the data from all the tables.

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
我是男神闪亮亮 2024-09-15 03:07:44
select xid,max(zid) as zid from y
group by xid
select xid,max(zid) as zid from y
group by xid
青朷 2024-09-15 03:07:44
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
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文