Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle- Penggabungan luar kiri pada beberapa tabel tidak mengembalikan nilai nol yang diinginkan

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dukungan untuk JSON di Oracle 11g

  2. Perbandingan Oracle UCP, C3P0 dan HikariCP

  3. Oracle DROP TABLE JIKA ADA Alternatif

  4. Bagaimana cara mengembalikan plsql lama?

  5. Oracle:Pencarian teks lengkap dengan kondisi