Вернуть строку, если не выполнено одно из многих условий - PullRequest
4 голосов
/ 14 июля 2011

Мне нужно получить список идентификаторов и соответствующее поле из таблицы, где идентификатор может не существовать. Например, таблица выглядит так:

 id  | status
-------------
1234 | A
4567 | B
1020 | C

Я хочу получить статус из строк с id=4567 и id=7777, например:

Result:
 id  | status
-------------
4567 | B
7777 | 

Поскольку записи с id = 7777 не существует, в ней должно отображаться пустое поле состояния.

Что у меня есть до сих пор: я могу получить пустую строку, когда нет записей ни для одного из совпадений идентификаторов, соединив результат с DUAL. Например:

SELECT id, status FROM DUAL LEFT OUTER JOIN mytable ON id='7777'

Дает результат пустой строки:

 id  | status
-------------
     | 

Но добавление действительного идентификатора в условие возвращает только одну строку:

SELECT id, status FROM mytable WHERE (id='7777' OR id='4567')

 id  | status
-------------
4567 | B

Как сделать так, чтобы запрос возвращал строку с запрошенным идентификатором, даже если в ней нет записи?

Ответы [ 4 ]

2 голосов
/ 14 июля 2011
SELECT  q.id, m.status
FROM    (
        SELECT  4567 AS id
        FROM    dual
        UNION ALL
        SELECT  7777 AS id
        FROM    dual
        ) q
LEFT JOIN
        mytable m
ON      m.id = q.id
0 голосов
/ 14 июля 2011

С временной таблицей, в которой вы храните 4567 и 7777, или с соответствующим запросом, вы можете сделать объединение:

SELECT DISTINCT n, '' 
  FROM tmp, tbl 
  WHERE n NOT IN (SELECT id FROM tbl) 
UNION (
SELECT id, status 
  FROM tmp, tbl 
  WHERE n=id);

Я протестировал его на postgresql - он может отличаться от синтаксиса на oracle.

0 голосов
/ 14 июля 2011

Используйте RIGHT OUTER JOIN вместо LEFT OUTER JOIN.

0 голосов
/ 14 июля 2011

Пусть external join возвращает значение из таблицы (слева), даже если в другой объединенной таблице нет соответствующей записи.(правое внешнее объединение такое же, за исключением того, что оно возвращает данные из таблицы справа, даже если в таблице слева нет соответствующей записи)

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

На самом деле это причина, по которой вы получаете данные для 4567.У вас есть запись, соответствующая 4567 в левой таблице (а не в dual).

У вас нет 7777 ни в одной из таблиц, и поэтому она не появляется в результате.

Здесь у вас есть два варианта: один, как сказал @Quassnoi, вы можете выбрать все записи из двойного и оставить соединение с другой таблицей.
Это может быть непрактично, если ваши данные динамическиеили если у вас много данных.В этом случае вы можете создать небольшую временную таблицу со своими данными, а затем соединиться с другой таблицей.Короче говоря: вам нужно где-то хранить данные, чтобы объединить их с другой таблицей.

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