prog:sql_anti_join
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
prog:sql_anti_join [2016/08/17 15:17] – [Der Ausführungsplan] gpipperr | prog:sql_anti_join [2016/08/18 20:57] (aktuell) – gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | =====Mit einem "Left Join" Daten filtern - Einen Anti Join in Oracle SQL erzeugen===== | ||
+ | |||
+ | Ziel ist es, alle Datensätze aus der Tabelle zu filtern, die <fc # | ||
+ | |||
+ | |||
+ | Beispiel: Hole alle Mitarbeiter deren Department NICHT in der Department Table vorkommt: | ||
+ | <code sql> | ||
+ | select EMPLOYEE_ID, | ||
+ | from EMPLOYEES e | ||
+ | LEFT JOIN DEPARTMENTS d ON ( nvl(e.DEPARTMENT_ID,' | ||
+ | where d.DEPARTMENT_ID is null; | ||
+ | </ | ||
+ | (nvl wird nur benötigt falls die Join Bedingung Null Values enthält!) | ||
+ | |||
+ | Durch den LEFT Join ist die Department ID ja NULL in der Ergebnismenge, | ||
+ | |||
+ | Genau auf diese Treffer filtern wir mit der " | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===Der Ausführungsplan=== | ||
+ | |||
+ | Klassisch wäre die Lösung mit " where nvl(e.DEPARTMENT_ID,' | ||
+ | |||
+ | |||
+ | Auf einer 11g ergibt sich tatsächlich der gleiche Plan, bin verwundert: | ||
+ | |||
+ | <code sql> | ||
+ | explain plan for select EMPLOYEE_ID, | ||
+ | |||
+ | .... | ||
+ | |||
+ | |||
+ | PLAN_TABLE_OUTPUT | ||
+ | ------------------------------------------------------------------------------------- | ||
+ | Plan hash value: 1538847337 | ||
+ | |||
+ | --------------------------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | --------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS ANTI | | 1 | 18 | | ||
+ | | 2 | TABLE ACCESS FULL| EMPLOYEES | ||
+ | |* 3 | INDEX UNIQUE SCAN| DEPT_ID_PK | 27 | 108 | | ||
+ | --------------------------------------------------------------------------------- | ||
+ | |||
+ | explain plan for select EMPLOYEE_ID, | ||
+ | |||
+ | .... | ||
+ | |||
+ | Plan hash value: 1538847337 | ||
+ | |||
+ | --------------------------------------------------------------------------------- | ||
+ | | Id | Operation | ||
+ | --------------------------------------------------------------------------------- | ||
+ | | 0 | SELECT STATEMENT | ||
+ | | 1 | NESTED LOOPS ANTI | | 1 | 18 | | ||
+ | | 2 | TABLE ACCESS FULL| EMPLOYEES | ||
+ | |* 3 | INDEX UNIQUE SCAN| DEPT_ID_PK | 27 | 108 | | ||
+ | --------------------------------------------------------------------------------- | ||
+ | |||
+ | </ | ||
+ | |||
+ | Muss ich noch auf einer 12c testen.... | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | siehe auch Join Syntax : [[prog: | ||
+ | |||
prog/sql_anti_join.txt · Zuletzt geändert: 2016/08/18 20:57 von gpipperr