PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kueri di mana kolom kunci asing bisa NULL

Jika "tidak ada baris sama sekali untuk uid", dan Anda JOIN seperti yang Anda lakukan, Anda mendapatkan tidak ada baris sebagai hasil. Gunakan LEFT [OUTER] JOIN sebagai gantinya:

SELECT u.uid, u.fname, u.lname
FROM   u 
LEFT   JOIN u_org o ON u.uid = o.uid 
LEFT   JOIN login l ON u.uid = l.uid 
WHERE (o.orgid = 2 OR o.orgid IS NULL)
AND    l.access IS DISTINCT FROM 4;

Juga, Anda memerlukan tanda kurung yang saya tambahkan karena diutamakan operator . (AND mengikat sebelum OR ).

Saya menggunakan IS DISTINCT FROM bukannya != dalam kondisi WHERE terakhir karena, sekali lagi, login.access mungkin NULL , yang tidak memenuhi syarat.

Namun, karena Anda sepertinya hanya tertarik pada kolom dari tabel u untuk memulainya, kueri alternatif ini akan lebih elegan:

SELECT u.uid, u.fname, u.lname
FROM   u
WHERE (u.uid IS NULL OR EXISTS (
   SELECT 1
   FROM   u_org o
   WHERE  o.uid = u.uid
   AND    o.orgid = 2
   ))
AND NOT EXISTS (
   SELECT 1
   FROM   login l
   WHERE  l.uid = u.uid
   AND    l.access = 4
   );

Alternatif ini memiliki keuntungan tambahan, yaitu Anda selalu mendapatkan satu baris dari u , bahkan jika ada beberapa baris di u_org atau login .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Catatan pos pemeriksaan utama Docker postgres tidak valid

  2. java.lang.IllegalArgumentException:im ==null?

  3. Ubah nama kolom tabel menjadi huruf besar di postgres

  4. Hapus fungsionalitas dengan spark sql dataframe

  5. Anotasi Kueri Boot Musim Semi dengan nativeQuery tidak berfungsi di Postgresql