Wie ersetze ich diese where-Klausel durch einen Join?

8

Wenn ich SQL sehe, das normalerweise Folgendes verwendet:

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

Ich ersetze das wheredurch:

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

Ist es möglich, dasselbe mit der Umkehrung zu tun, wenn es sich um eine not in(wie unten) anstelle einer inKlausel handelt?

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
                        )  

Weitere Überlegungen

Kann ich das tun:

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
Kakalapy
quelle

Antworten:

6

Ja. Sie können durch einen LEFT JOIN ersetzen ... WHERE-Taste ist NULL. Funktioniert viel schneller.

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
Eric Humphrey - Lotsahelp
quelle
Was ist die Leistung zwischen den beiden? Ich würde denken, dass Joins viel schneller sind als die Verwendung in (...) oder nicht in (...).
Kakalapy
Kann ich auch alles in den Join aufnehmen, siehe meine Bearbeitung am Ende der Frage
Kacalapy
1
Sie müssen die WHERE-Klausel haben, wie ich angegeben habe.
Eric Humphrey - Lotsahelp
4
"Leistung viel schneller"? Als NICHT EXISTIERT oder NICHT IN? Wenn NICHT IN, ja. Wenn nicht vorhanden, ziemlich gleich.
Gbn
1
Beispiel oder am SO
gbn
7

Ihr NOT EXISTS ist in den meisten Fällen effizienter.

LEFT JOIN stimmt intern mit allen Zeilen überein und filtert dann nach IS NULL. NICHT EXISTIERT nicht. Diese Zeilenmultiplikation findet auch in allen JOIN-basierten Codes statt, sodass Sie möglicherweise ein zusätzliches Aggregat (DISTINCT) benötigen, um die Ausgabe zu korrigieren

NOT IN ist im Allgemeinen falsch, da NULL-Werte keine Übereinstimmung verursachen.

Sie können auch EXCEPT verwenden, das den gleichen Plan wie NOT EXISTS enthält.

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          

Zu Ihrer Information , gemäß dem SQL-92-Standard (Seite 191, Fall 3a) wird das SELECT-Bit der EXISTS ignoriert.

gbn
quelle