Предоставляет ли спецификация SQL лучший способ сделать исключительное ORing из двух наборов? - PullRequest
4 голосов
/ 03 февраля 2010

У меня есть результирующий набор A, который составляет 10 строк 1-10 {1,2,3,4,5,6,7,8,9,10}, и B, который составляет 10 строк, состоящих из четных 1-20 {2,4,6,8,10,12,14,16,18,20}.Я хочу найти элементы, которые находятся в одном наборе, но не в обоих.Других столбцов в строках нет.

Я знаю, что UNION будет A + B.Я могу найти их как в A, так и в B с A INTERSECT B.Я могу найти все строки в A, которые не в B с A EXCEPT B.

. Это подводит меня к вопросу, как найти все строки, которые находятся в A или B, но не оба , есть ли транзитивный эквивалент ( A EXCEPT B ) UNION ( B EXCEPT A) в спецификации sql?Я хочу набор {1,3,5,7,9,12,14,16,18,20}.Я полагаю, что это также можно записать A UNION B EXCEPT ( A INTERSECT B )

Есть ли в теории множеств математическая причина, почему это нельзя сделать за одну операцию (это можно объяснить тому, кто не понимает теорию множеств)?Или это просто не реализовано, потому что так просто создать себя?Или я просто не знаю лучшего способа сделать это?

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

Ответы [ 2 ]

6 голосов
/ 03 февраля 2010

Есть еще один способ сделать то, что вы хотите, используя FULL OUTER JOIN с предложением WHERE, чтобы удалить строки, которые появляются в обеих таблицах.Это, вероятно, более эффективно, чем предложенные вами конструкции, но вам, конечно, следует измерить производительность обоих.Вот запрос, который вы можете использовать:

SELECT COALESCE(A.id, B.id) AS id
FROM A
FULL OUTER JOIN B
ON A.id = B.id
WHERE A.id IS NULL OR B.id IS NULL
2 голосов
/ 03 февраля 2010

Операция типа «исключающий или» также называется симметричной разностью наборов в теории множеств. Используя эту фразу в поиске, я нашел страницу, описывающую ряд методов для реализации Симметричного различия в SQL . Описывает пару запросов и как их оптимизировать. Хотя детали, по-видимому, специфичны для Oracle, общие методы, вероятно, применимы к любой СУБД.

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