Копировать LEFT OUTER JOIN в предложении WHERE - PullRequest
0 голосов
/ 09 сентября 2009

Как мне реплицировать LEFT OUTER JOIN в предложении WHERE? По сути, я хочу использовать крестик, а не объединение в предложении FROM, а затем соответствующим образом отфильтровать вторую таблицу:


    SELECT A.KEY, B.KEY
    FROM A, B
    WHERE ?????;
Обратите внимание, что ключ не будет нулевым в любом случае и будет уникальным.

Ответы [ 4 ]

4 голосов
/ 09 сентября 2009

Если предположить, что столбец, к которому вы хотите присоединиться, равен KEY из обеих таблиц,

SELECT A.KEY, B.KEY
FROM A, B
WHERE A.KEY *= B.KEY
2 голосов
/ 10 сентября 2009

David

Мой загадочный ответ: «Ты не можешь». Несмотря на ответы других, кросс-соединение не содержит нужной вам информации. Если вы ограничите набор результатов перекрестного объединения подмножеством перекрестного объединения (для чего и используется предложение WHERE), вы не получите желаемого. Если, конечно, вы не используете оператор подлости и зла * =, который переворачивает математическое / реляционное значение предложения WHERE на его голову.

Предложение Йарахера о UNION было разумным (если плохое исполнение), и фактически в стандарте SQL соединения OUTER определяются в терминах внутренних объединений с объединениями. Так что, если вы возражаете против слова OUTER, вы можете сделать это:

SELECT A.KEY, B.KEY
FROM A, B
WHERE A.KEY *= B.KEY
UNION ALL
SELECT A.KEY, NULL
FROM A
WHERE NOT EXISTS (
  SELECT * FROM B AS B2
  WHERE B2.KEY = A.KEY
)

Но при отсутствии извращений языка, таких как * =, вы не можете получить больше (внешние строки), попросив меньше (добавив предложение WHERE).

Я искренне согласен с Гбн, который говорит * = "укусит тебя позже". Или это кого-то укусит и будет твоя вина. Это зло (я уже говорил?), И на самом деле некоторые более сложные запросы, содержащие этот оператор, просто не определены. Если оператор * = где-то скрыт в представлении, у вас проблемы.

Использование * = безответственно. Это похоже на использование провода 18-го калибра для подключения переключателя для цепи на 20 А , которую вы используете только для двигателя на половину А. Если бы существовал SQL-код, такой как электрический код, * = не соответствовал бы коду. (И, к счастью, в некоторых магазинах, например, у Адама, нет.)

(Вы даже не можете ввести в Stackoverflow слишком близко к тексту курсивом, не экранируя его, это так плохо.)

2 голосов
/ 09 сентября 2009

Может не применяться, но упомянутая A.KEY *= B.KEY - это история в более поздних версиях MS SQL Server , поиск "Use of *= and =*"

Здесь не пройдут наши обзоры кода ...

0 голосов
/ 09 сентября 2009

Почему бы не использовать UNION?

(SELECT KEY FROM A WHERE ????) 
UNION
(SELECT KEY FROM B WHERE ????) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...