Максимальное значение в отношениях многих ко многим - PullRequest
5 голосов
/ 02 июля 2010

Я использую SQL Server 2008, и у меня есть 3 таблицы, x, y и z.y существует для создания отношения «многие ко многим» между x и z.

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

Все вышеперечисленные поля 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

Результирующий набор должен быть

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

Обратите внимание, что если существует более одного z с одним и тем же самым высоким sort значением, тогда я все еще хочу только одну строку на x.

Обратите внимание, что в моей реальной ситуации во всех трех таблицах есть другие поля, которые мне понадобятся в моем наборе результатов.

Ответы [ 3 ]

0 голосов
/ 02 июля 2010

Один метод с подзапросом.Это, однако, хорошо только для получения идентификатора Z. Если вам нужно больше / все столбцы из таблиц 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
0 голосов
/ 02 июля 2010
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
0 голосов
/ 02 июля 2010
select xid,max(zid) as zid from y
group by xid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...