Anda perlu mendapatkan pemahaman yang lebih baik tentang cara kerja LEFT JOIN (gabungan luar secara umum - gabungan kiri/kanan dan [luar] penuh)
Gabungan KIRI selalu dilakukan dalam dua langkah:
SELECT ....
FROM table1
LEFT JOIN table1 ON join_conditions
WHERE where_conditions
Langkah 1 - LEFT JOIN dilakukan terlebih dahulu (menggunakan kondisi yang ditentukan dalam klausa ON untuk menggabungkan dua tabel)
Langkah 2 - kondisi WHERE diterapkan pada hasil yang dihasilkan oleh gabungan pada langkah 1
Cara kerja LEFT JOIN - pengingat cepat:LEFT JOIN selalu mengembalikan SEMUA baris dari tabel kiri, bahkan baris ini yang tidak ada kecocokannya di tabel kanan. Ketika tidak ada kecocokan (kondisi ON bernilai false), LEFT JOIN mengembalikan NULL untuk tabel kanan.
RIGHT JOIN bekerja dengan cara yang sama, tetapi mengembalikan semua baris dari tabel RIGHT, bukan yang kiri sebagai KIRI GABUNG.
JADI jika Anda memiliki pertanyaan ini:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
WHERE H.STATUS='COMPLETED'
database terlebih dahulu melakukan LEFT JOIN, yaitu:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
Kueri di atas memberikan hasil berikut (perhatikan NULL di 3 baris terakhir di sisi kanan):
| S.GROUP | S.TABLE_ID | H.RUN_DATE | H.STATUS |
|-----------|------------|----------------------------|-----------|
| Sales | 1210 | January, 05 2016 00:00:00 | COMPLETED |
| Sales | 1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | March, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | January, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | March, 05 2016 00:00:00 | COMPLETED |
| Sales | 1245 | (null) | (null) |
| Reference | 1650 | (null) | (null) |
| Sales | 1784 | (null) | (null) |
Dan kemudian database melakukan kondisi WHERE pada hasil di atas:
WHERE H.STATUS='COMPLETED'
Sejak NULL='COMPLETED'
bernilai FALSE, maka hasil akhir dari query tersebut adalah:
| GROUP | TABLE_ID | RUN_DATE | STATUS |
|-----------|----------|----------------------------|-----------|
| Sales | 1210 | January, 05 2016 00:00:00 | COMPLETED |
| Sales | 1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | March, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | January, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | March, 05 2016 00:00:00 | COMPLETED |
yaitu:semua NULL dilewati.
Lihat demo ini:http://sqlfiddle .com/#!9/e2ed0/3
Jika Anda ingin mendapatkan juga catatan dengan nilai NULL, Anda perlu mengubah kondisi ini menjadi:
WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )
Anda juga dapat menghapus kondisi ini dari klausa WHERE, dan menambahkannya ke kondisi ON dari LEFT JOIN, yaitu:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON ( S.TABLE_ID=H.TABLE_ID AND H.STATUS='COMPLETED' )
lihat kueri terakhir dalam demo ini:http://sqlfiddle.com/#!9/e2ed0 /3