2010-01-23 13 views
18

Mantık içinde bir hata yapıp yapmadığımdan emin değilim.null değerinde iç birleştirme

i bir sorgu var ve bir iç hep sonuç alacağı bir boş değere sahip katılmak ya da katılmak ve başarılı göz ardı eder yaparsanız? örnek

user { id PK, name NVARCHAR NOT NULL, banStatus nullable reference } 

Eğer yazıyorsam ve u.banStatus hiçbir satır alamıyor mu?

select * from user as u 
join banstatus as b on u.banStatus=b.id 
where id=1 
+0

Neden sadece denemiyorsunuz? –

+1

NULL tanımlı değil, bu nedenle NULL = NULL ise, iki tanımsız değeri karşılaştırdığımızdan sonuç her zaman yanlış olur. Umarım sorgunuzu cevaplar –

+0

Ayrıca sorunuzda bir hata var. Buradaki "id" alanı, belirsizdir - "u.id" veya "b.id" olabilir. –

cevap

6

Bunu yaptığınızda bir INNER JOIN, NULL değerleri şeyle uyuşmuyor. Birbirleriyle bile değil. Bu yüzden sorgunuz herhangi bir satır döndürmüyor. BOŞ bile BOŞ, hiçbir şeye eşit olamaz çünkü katılmak null ise (Source)

44

Sen satır alamadım.

Bir SOL için bunu değiştirirseniz

o zaman satır alacak, JOIN. bir iç ile

birleştirme: bir sol ile
select * from user as u 
join banstatus as b on u.banStatus=b.id 

1, '1', 1, 'Banned' 

birleştirme:

select * from user as u 
left join banstatus as b on u.banStatus=b.id 

1, '1', 1, 'Banned' 
2, 'NULL', , '' 

Bu test verilerini kullanarak: Bu bir iç boş değerlere birleşimler olup

CREATE TABLE user (id int, banstatus nvarchar(100)); 
INSERT INTO user (id, banstatus) VALUES 
(1, '1'), 
(2, 'NULL'); 

CREATE TABLE banstatus (id int, text nvarchar(100)); 
INSERT INTO banstatus (id, text) VALUES 
(1, 'Banned'); 
+2

test verilerine ya da başka bir şeye ihtiyaç duymadım (evet satırları alamayacaksınız) ama gelecekteki okuyucular için iyi. +1 & kabul edin. –

5

(Oracle sözdizimi):

select * 
    from user 
     uu 
    join banstatus 
     bb 
    on uu.banstatus = bb.id 
     or 
     uu.banstatus is null and bb.id is null 
+0

Yani kullanıcı ve bb boş olduğunda bu katılır? ilginç. id asla sıfır veya 0 olmazdı. Eğer uu.banstatus = bb.id üzerinde yazdım ya da uu.banstatus boşsa, onu görmezden gelip bana 0 satır vermeyecek mi? Bu sol birleşim ile aynı olur mu? İlginç. Artık cevaba ihtiyacım yok ama eğer bir şey vermek istersen, okuyacağım. –

+1

Hayır, bu bir sol birleştirme gibi davranmayacak. Eğer bb.id 'asla boş olmazsa, null 'uu.banstatus' ile sonuçta satır olmayacaktır. –

+0

+1. İlginç yazı: D –

İlgili konular