я недавно задавал этот вопрос и был немного озадачен, поэтому я хочу спросить экспертов ...SQL заявление для возврата записей без пересечения
Даны два таблиц А & B, я хочу, чтобы вернуть все значения от A и B, которые не перекрываются. Подумайте о двух перекрывающихся кругах; как мы можем вернуть все данные, которые НЕ находятся в перекрывающейся центральной части? И мне пришлось использовать ANSI Standard SQL, а не синтаксис Oracle.
Предположим, что мы хотим все исключительно как А, так & B, мой ответ был
select *
from A
cross join B
minus
(select a.common_column from a
intersect
select b.common_column)
ли это выглядеть правильно, или даже близко? Если это правильно, есть ли более эффективный способ сделать это?
BTW - мое решение было обоснованно отклонен ....
Спасибо!
Идет близко. Я бы пошел с «union all» вместо перекрестного соединения для внешнего запроса. –
Почему вы выполняете крест? Это создаст декартово произведение A и B.Предполагая, что A и B содержат более одного столбца, этот запрос не будет компилироваться (поскольку перекрестное соединение B возвращает столбцы NxM, тогда как вторая часть возвращает 1 столбец). –
Да, вы не хотите «перекрестное присоединение» .... Либо выполните «union all», либо «except» на 'intersect', или просто сделайте' union all' on 'select col from A кроме select col from B' и 'select col from B, кроме select col from A' –