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 № 1Cóż, 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.