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 слишком близко к тексту курсивом, не экранируя его, это так плохо.)