2010-01-23 38 views
18

Tôi không chắc chắn nếu tôi đã thực hiện một sai lầm trong logic.bên trong tham gia vào giá trị null

Nếu tôi có truy vấn và tôi tham gia bên trong với giá trị null, tôi sẽ không nhận được kết quả hoặc nó sẽ bỏ qua việc tham gia và thành công? ví dụ

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

nếu tôi viết và u.banStatus tôi sẽ không nhận được hàng?

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

Tại sao bạn không thử? –

+1

NULL là không xác định, vì vậy nếu chúng ta có NULL = NULL thì kết quả sẽ luôn là sai, vì chúng ta so sánh hai giá trị không xác định. Tôi hy vọng nó trả lời truy vấn của bạn –

+0

Ngoài ra còn có một lỗi trong truy vấn của bạn. Trường 'id' trong mệnh đề where của bạn không rõ ràng - nó có thể là' u.id' hoặc 'b.id'. –

Trả lời

6

Khi bạn thực hiện một giá trị INNER JOIN, NULL không khớp với bất kỳ thứ gì. Ngay cả với nhau. Đó là lý do tại sao truy vấn của bạn không trả lại bất kỳ hàng nào. (Source)

44

Bạn không nhận được hàng nếu tham gia là null vì NULL không thể bằng bất cứ điều gì, thậm chí NULL.

Nếu bạn đổi thành LEFT JOIN, bạn sẽ nhận được hàng.

Với một bên tham gia:

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

1, '1', 1, 'Banned' 

Với một trái tham gia:

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

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

Sử dụng dữ liệu thử nghiệm này:

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

tôi didnt cần dữ liệu thử nghiệm hoặc bất cứ điều gì khác sau đó một cấu hình (có bạn sẽ không nhận được hàng) nhưng tốt cho độc giả trong tương lai. + 1 & chấp nhận. –

5

Đây là một bên tham gia vào null (Oracle cú pháp):

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

để tham gia này khi người dùng và bb là null? hấp dẫn. id sẽ không bao giờ là null hoặc 0. Nếu tôi đã viết 'trên uu.banstatus = bb.id hoặc uu.banstatus là null' nó sẽ bỏ qua nó và tham gia và không cho tôi 0 hàng? điều này sẽ giống như tham gia trái? Hấp dẫn. Tôi không còn cần câu trả lời nữa nhưng nếu bạn cảm thấy thích tôi sẽ đọc. –

+1

Không, thao tác này sẽ không hoạt động như tham gia trái. Nếu 'bb.id' không bao giờ là null, sẽ không có hàng nào trong kết quả với null' uu.banstatus'. –

+0

+1. Thú vị đăng bài: D –

Các vấn đề liên quan