dzisiejsza zagadka to praktycznie crosspost z grupy newsowej pl.comp.bazy-danych, ale nie pamiętam dokładnie kto to wtedy pisał – jak się odezwie to oczywiście dam linka.
pytanie jest relatywnie proste.
mamy dwie tabele:
CREATE TABLE tab_a ( pole_a TEXT, pole_b TEXT );
CREATE TABLE tab_b (
pole_c TEXT );
wstawiamy do nich testowe dane:
INSERT INTO tab_a (pole_a, pole_b) VALUES ('a', '1'); INSERT INTO tab_a (pole_a, pole_b) VALUES ('b', '2'); INSERT INTO tab_a (pole_a, pole_b) VALUES ('c', '3'); INSERT INTO tab_a (pole_a, pole_b) VALUES ('d', '4'); INSERT INTO tab_b (pole_c) VALUES ('e'); INSERT INTO tab_b (pole_c) VALUES ('f');
na razie nic trudnego. teraz – zaraz podam zapytanie o które chodzi, proszę – nie wykonuj tego u siebie. postaraj się domyśleć co to zapytanie zwróci:
SELECT * FROM tab_a WHERE pole_a IN ( SELECT pole_a FROM tab_b );
i teraz – co to zapytanie zwróci:
- nic, bo się wywali z błędem. jakim?
- nic, zwróci zero rekordów, ale błędu nie będzie.
- zwróci jakieś rekordy. jakie? ile?
prawda, że proste? na pewno?
nic nie zwroci – wywali sie z bledem nieznana kolumna w podzapytaniu
Pierwsza mysl — nic z bledem (nieznana kolumna w podzapytaniu). Druga mysl — produkt kartezjanski tab_a z jej kolumna pole_a, czyli 16 rekordow… i choc wyglada to podejrzanie, to postawie na ta druga mysl;-)
Pozdrawiam,
M.
PS: czy ten layout na blogu to na stale, czy tymczasowo? literki troche za male.
Wszystkie rekordy z tab_a. Mamy na tapecie podzapytanie skorelowane, które za każdym razem wybiera 2 pasujące wartości, i in zwróci true.