Mi sembra che puoi fare la stessa cosa in una query SQL usando NOT EXISTS, NOT IN o LEFT JOIN WHERE IS NULL. Per esempio:
SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)
SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)
SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL
Non sono sicuro di aver corretto tutta la sintassi, ma queste sono le tecniche generali che ho visto. Perché dovrei scegliere di utilizzare l'uno sull'altro? Le prestazioni differiscono ...? Quale di questi è il più veloce / efficiente? (Se dipende dall'implementazione, quando dovrei usarli?)
EXISTSclausola. Puoi tornare *, NULLo qualsiasi altra cosa: tutto questo sarà ottimizzato via.
SELECTe FROM. Ed *è semplicemente più facile da scrivere. Sì, SQLha una certa somiglianza con un linguaggio naturale, ma è analizzato ed eseguito da una macchina, una macchina programmata. Non è che si rompa improvvisamente nel tuo cubicolo e grida "smetti di chiedere i campi extra in una EXISTSquery perché sono stufo di analizzarli e poi di buttarli via!". Va bene con un computer, davvero.