Запрос на объединение всей информации из трех таблиц - PullRequest
1 голос
/ 13 декабря 2011

Мне нужно объединить 3 таблицы в SQL Server.Эти 3 таблицы в основном имеют следующую схему:

   Users                Items                     UsersItems
+--------+    +--------+-------------+    +--------+--------+-------+
| UserID |    | ItemID | Description |    | UserID | ItemId | Value |
+--------+    +--------+-------------+    +--------+--------+-------+
|   1    |    |   1    |    desc1    |    |   1    |    1   |   1   |
|   2    |    |   2    |    desc2    |    |   1    |    2   |   2   |
|  ...   |    |  ...   |    desc3    |    |   2    |    2   |   1   |
|   n    |    |   n    |    desc4    |    |   n    |    1   |   1   |
+--------+    +--------+-------------+    +--------+--------+-------+

Как вы можете видеть, как пользователи, так и элементы могут расти бесконечно, а UsersItems используется для выражения отношений между этими двумя, включая столбец Value.

Мне нужен запрос для извлечения всех пользователей, а для каждого пользователя Мне нужны все элементы с соответствующим значением.

Если отношение не существует в UsersItems, тогда Null(или значение по умолчанию) должно быть возвращено для столбца Value этой строки.

Ожидаемый результат запроса должен быть:

             ResultSet
    +--------+--------+-------+
    | UserID | ItemID | Value |
    +--------+--------+-------+
    |   1    |   1    |   1   |
    |   1    |   2    |   2   |
    |   1    |   n    |  NULL |
    |   2    |   1    |  NULL |
    |   2    |   2    |   1   |
    |   2    |   n    |  NULL |
    |   n    |   1    |   1   |
    |   n    |   n    |  NULL |
    +--------+--------+-------+

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Хорошо, поскольку есть несколько ответов, которые, по моему мнению, не верны, я опубликую то, что я думаю, что ответ:

SELECT Users.UserID,
       Items.Description,
       UsersItems.Value
FROM
       Users
CROSS JOIN
       Items
LEFT JOIN
       UsersItems
ON
       Users.UserID = UsersItems.UserID
AND
       Items.ItemID = UsersItems.ItemID

Я предполагаю, что ваш комментарий о нулях, которые вы хотитечтобы увидеть все элементы, снова отображаются все пользователи с таблицей Value из таблицы UsersItems, в которой он существует.

1 голос
/ 13 декабря 2011
SELECT
     Users.UserID,
     Items.Description,
     Items.Value

FROM Users LEFT OUTER JOIN UsersItems
          ON Users.UserID = UsersItems.UserID
     LEFT OUTER JOIN Items
          ON UserItems.ItemID = Items.ItemID
0 голосов
/ 13 декабря 2011

Вы делаете это так:

SELECT Users.UserID, Items.Description, Items.Value
FROM Users
LEFT OUTER JOIN UsersItems ON Users.UserID = UsersItems.UserID
LEFT OUTER JOIN Items ON UserItems.ItemID = Items.ItemID

Для получения дополнительной информации о левом внешнем соединении прочитайте следующее:

Результат левого внешнего соединения (илипросто левое соединение) для таблицы A и B всегда содержит все записи «левой» таблицы (A), даже если условие соединения не находит подходящих записей в «правой» таблице (B).Это означает, что если предложение ON соответствует 0 (нулю) записей в B, соединение все равно будет возвращать строку в результате, но с NULL в каждом столбце из B. Это означает, что левое внешнее объединение возвращает все значения слеватаблица, плюс сопоставленные значения из правой таблицы (или NULL в случае отсутствия соответствующего предиката соединения).Если правая таблица возвращает одну строку, а левая таблица возвращает более одной соответствующей строки, значения в правой таблице будут повторяться для каждой отдельной строки в левой таблице.Начиная с Oracle 9i, можно использовать оператор LEFT OUTER JOIN, а также (+).

...