Как использовать объединение для запроса двух таблиц и получения всех строк из одной и связанных строк из другой? - PullRequest
3 голосов
/ 18 ноября 2008

Упрощенно, например, у меня есть две таблицы, groups и items.

items (
    id,
    groupId,
    title
)

groups (
    id,
    groupTitle,
    externalURL
)

Обычный запрос у меня выглядит примерно так:

SELECT
    i.`id`,
    i.`title`,
    g.`id` as 'groupId',
    g.`groupTitle`,
    g.`externalURL`
FROM
    items i INNER JOIN groups g ON (i.`groupId` = g.`id`)

Однако мне нужно изменить это сейчас, потому что все группы, которые указывают externalURL, не будут иметь никаких соответствующих записей в таблице items (так как они хранятся снаружи). Можно ли сделать какое-то соединение, чтобы результат выглядел примерно так:

items:
id    title    groupId
----------------------
1     Item 1   1
2     Item 2   1

groups
id    groupTitle    externalURL
-------------------------------
1     Group 1       NULL
2     Group 2       something
3     Group 3       NULL

Query output:
id    title    groupId    groupTitle    externalURL
---------------------------------------------------
1     Item 1   1          Group 1       NULL
2     Item 2   1          Group 1       NULL
NULL  NULL     2          Group 2       something

-- note that group 3 didn't show up because it had no items OR externalURL

Возможно ли это в одном запросе SQL?

1 Ответ

11 голосов
/ 18 ноября 2008

Это именно то, для чего используется внешнее соединение: вернуть все строки из одной таблицы, независимо от того, есть ли соответствующая строка в другой таблице. В этих случаях верните NULL для всех столбцов другой таблицы.

Другое условие, о котором вы можете позаботиться в предложении WHERE.

SELECT
    i.`id`,
    i.`title`,
    g.`id` as 'groupId',
    g.`groupTitle`,
    g.`externalURL`
FROM
    items i RIGHT OUTER JOIN groups g ON (i.`groupId` = g.`id`)
WHERE i.`id` IS NOT NULL OR g.`externalURL` IS NOT NULL;

Только если и i.id, и g.externalURL равны NULL, вся строка объединенного результирующего набора должна быть исключена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...