Оператор минус в oracle

минус оператор

у меня есть 2 таблицы A и B.

SELECT COUNT(*) FROM (SELECT * FROM tableA)

возвращает 389

SELECT COUNT(*) FROM (SELECT * FROM tableB)

возвращает 217

SELECT COUNT(*) FROM
(SELECT * FROM tableA
INTERSECT
SELECT * FROM tableB)

возвращает 0

SELECT COUNT(*) FROM 
(SELECT * FROM tableA
MINUS
SELECT * FROM tableB)

возвращает 389

SELECT COUNT(*) FROM 
(SELECT * FROM tableB
MINUS
SELECT * FROM tableA)

возвращает 89

может кто-нибудь объяснить, почему последний запрос возвращает 89, а не 217?

2 ответов


минус принимает первый результирующий набор и удаляет все, что существует во втором результирующем наборе;Он также удаляет все дубликаты.

в вашем примере tableA имеет 389 строк, а tableB имеет 217 строк; ваш пересечение показывает, что нет общих строк, что означает, что tableA минус tableB составляет 389 строк (т. е. все из них).

tableB минус tableA возвращает отдельный набор строк в tableB, поэтому в tableB есть 89 различных значений.


предположим, если вы установили A и B, A = {1,2,3,4} и count (A) = 4, B = {5,6,6,7,7} и count (B) = 5

A-B = {1,2,3,4} таким образом, count(A-B) = count(A) = 4

но B-A = {5,6,7} и count (B) = 3

таким образом, мы понимаем, что минус исключает дубликаты терминов(или строк). Вот почему количество строк сократилось с 217 до 89.

надеюсь, что это помогает.