Làm thế nào để tôi thay thế mệnh đề này bằng một tham gia?


8

Thông thường khi tôi thấy SQL sử dụng cái gì đó như:

select * from employees where epmloyeeTypeId in (select id from type where name = 'emp') 

Tôi thay thế wherebằng cái này:

select e.* from employees e 
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'

Có thể làm tương tự với nghịch đảo trong trường hợp nó là một not in(như dưới đây) thay vì một inmệnh đề?

INSERT into Subscriptions(ProjectId, RecordTypeCID, NTID, Active, Added, LastUpdate, UpdateBy)   
 SELECT @ProjectId, RecordTypeCID, @NTID, 1, GETDATE(), GETDATE(), @NTID  
 FROM @Check CHK  
 WHERE CHK.ActiveStatus=1  
        And Not Exists (SELECT SubscriptionId FROM Subscriptions  
                        WHERE ProjectId=@ProjectId           
                        and NTID=@NTID          
                        and RecordTypeCID = CHK.RecordTypeCID
                        )  

Xem xét bổ sung

Tôi có thể làm điều này:

INSERT INTO Subscriptions(ProjectId, RecordTypeCID, NTID,Active, Added, LastUpdate, UpdateBy)   
SELECT @ProjectId, RecordTypeCID, @NTID,1, GETDATE(), GETDATE(), @NTID  
FROM @Check CHK
    LEFT JOIN Subscriptions subs ON subs.RecordTypeCID = CHK.RecordTypeCID
        AND NTID = @NTID
        AND ProjectId = @ProjectId

        AND CHK.ActiveStatus = 1
        AND subs.SubscriptionId IS NULL

Câu trả lời:


6

Đúng. Bạn có thể thay thế bằng một THAM GIA TRÁI ... Phím WHERE LÀ NULL. Thực hiện nhanh hơn nhiều.

INSERT INTO Subscriptions(
    ProjectId, RecordTypeCID, NTID,
    Active, Added, LastUpdate, UpdateBy)   
SELECT @ProjectId, RecordTypeCID, @NTID,
    1, GETDATE(), GETDATE(), @NTID  
FROM @Check CHK
LEFT JOIN Subscriptions subs
    ON subs.RecordTypeCID = CHK.RecordTypeCID
        AND NTID = @NTID
        AND ProjectId = @ProjectId
WHERE CHK.ActiveStatus = 1
    AND subs.SubscriptionId IS NULL

hiệu suất khác nhau giữa hai? Tôi có thể nghĩ rằng việc tham gia nhanh hơn nhiều so với sử dụng trong (...) hoặc không trong (...), không bao giờ nghĩ đến việc tồn tại (...) bất kỳ ý tưởng nào?
kacalacco

Ngoài ra tôi có thể bao gồm mọi thứ trong phần tham gia không, xem phần chỉnh sửa của tôi ở cuối câu hỏi
kacalacco

1
Bạn phải có mệnh đề WHERE như tôi đã nêu.
Eric Humphrey - lotahelp

4
"Thực hiện nhanh hơn nhiều"? Hơn KHÔNG HIỆN TẠI hay KHÔNG Ở? Nếu KHÔNG VÀO, có. Nếu KHÔNG EXISTS, khá bằng nhau.
gbn

1
Ví dụ hoặc trên SO
gbn

7

KHÔNG EXISTS của bạn hiệu quả hơn trong hầu hết các trường hợp.

LEFT THAM GIA nội bộ khớp với tất cả các hàng sau đó lọc thành IS NULL. KHÔNG EXISTS không. Phép nhân hàng này cũng xảy ra trong tất cả các mã dựa trên THAM GIA để bạn có thể cần một tổng hợp bổ sung (DISTINCT) để sửa lỗi đầu ra

KHÔNG IN thường sai vì NULL không khớp.

Bạn cũng có thể sử dụng EXCEPT cung cấp gói tương tự như KHÔNG EXISTS.

SELECT @ProjectId, RecordTypeCID, @NTID,1, GETDATE(), GETDATE(), @NTID  
FROM @Check CHK
EXCEPT
SELECT @ProjectId, RecordTypeCID, @NTID,1, GETDATE(), GETDATE(), @NTID  
FROM Subscriptions
WHERE ProjectId=@ProjectId           
and NTID=@NTID          

FYI, theo tiêu chuẩn SQL-92 (trang 191, Trường hợp 3a) , bit CHỌN của EXISTS bị bỏ qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.