it-swarm-fr.com

Comment puis-je remplacer cette clause avec une jointure?

Typiquement, quand je vois SQL qui utilise quelque chose comme:

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

Je remplace le where avec ceci:

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

Est-il possible de faire la même chose avec l'inverse au cas où c'est un not in (comme ci-dessous) au lieu d'une clause in?

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 [email protected]           
                        and [email protected]          
                        and RecordTypeCID = CHK.RecordTypeCID
                        )  

Considérations supplémentaires

Puis-je faire ceci:

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
8
kacalapy

Oui. Vous pouvez remplacer par une jointure gauche ... où la touche IS null. Effectue beaucoup plus vite.

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
6

Votre n'existe pas est plus efficace dans la plupart des cas.

Rejoindre à gauche correspond à toutes les lignes, puis filtres à IS null. Vous n'existe pas. Cette multiplication de ligne se produit également dans tous les groupes de joints, afin que vous puissiez avoir besoin d'un agrégat supplémentaire (distinct) pour réparer le production

Ce n'est généralement pas faux parce que les null ne causent aucune correspondance.

Vous pouvez également utiliser sauf qui donne le même plan que cela n'existe pas.

SELECT @ProjectId, RecordTypeCID, @NTID,1, GETDATE(), GETDATE(), @NTID  
FROM @Check CHK
EXCEPT
SELECT @ProjectId, RecordTypeCID, @NTID,1, GETDATE(), GETDATE(), @NTID  
FROM Subscriptions
WHERE [email protected]           
and [email protected]          

FYI, conformément à la norme standard SQL-92 (page 191, cas 3a) Le bit de sélection de l'exist est ignoré.

7
gbn