/ / Błąd w użyciu EXCEPT z INTERSECT w SQL - sql, database

Błąd w użyciu EXCEPT z INTERSECT w SQL - sql, database

Załóżmy, że mam trzy tabele, Tabela A, Tabela B i Tabela C.

Tabela A zawiera col t1 z hasłami 1,2,2,3,4,4.
Tabela B zawiera col t2 z zapisami 1,3,4,4.
Tabela C zawiera col t3 z wpisami 1,2,4,4.

Podane zapytanie było

SELECT * FROM  A EXCEPT (SELECT * FROM  B INTERSECT SELECT * FROM C ).

Widziałem to pytanie w dokumencie testowym. Wspomniano, że oczekiwana odpowiedź to 2, ale odpowiedź uzyskana z tego zapytania wyniosła 1,2,4. Nie jestem w stanie zrozumieć zasady stojącej za tym.

Odpowiedzi:

2 dla odpowiedzi № 1

Cóż, jak widzę, zarówno oczekiwana odpowiedź, jak i uzyskana odpowiedź są błędne. Może to być RDBMS, którego używasz, ale analizując zapytanie, wyniki powinny być 2,3. Najpierw powinieneś zrobić INTERSECT między tabelami B i C, wartości, które przecinają się 1 i 4. Biorąc ten wynik, powinieneś wziąć wszystkie wartości z tabeli A z wyjątkiem 1 i 4, to pozostawia nam 2 i 3 (od EXCEPT i INTERSECT zwracaj tylko różne wartości). Oto piksel z tym, aby spróbować.


1 dla odpowiedzi nr 2

Ze względu na wspornik, INTERSECT pomiędzy B i C wykonuje się najpierw, co daje (1,4). Możesz nawet sprawdzić, czy to bierze się za ostatnią część i działa w izolacji:

SELECT * FROM  B INTERSECT SELECT * FROM C

Następnym krokiem jest wybranie wszystkiego w A Z WYJĄTKIEM tych, które istnieją w poprzednim wyniku (1,4), który odchodzi (2,3).

Odpowiedź powinna wynosić 2 i 3, a nie 1,2 i 4.

BTW, należy wspomnieć, że nawet jeśli miałeśbez żadnego nawiasu w zapytaniu, wynik powinien być nadal taki sam, ponieważ operator INTERSECT ma wyższy priorytet niż operatory EXCEPT / UNION. To jest SQL Server dokumentacja, ale jest zgodna ze standardem, który ma zastosowanie do każdego DBMS, który implementuje te operatory.