SQL: Sélectionnez les lignes d'une table en filtrant plusieurs colonnes de la même table par un résultat de sélection de 3 colonnes

J'ai une table où je veux filterr toutes les lignes qui ont un code, Life et TC égal aux résultats d'une requête de sélection sur la même table filtrée par ID

ID Code|Life|TC|PORT 62 XX101 1 1 1 63 XX101 1 1 2 64 AB123 1 1 1 65 AB123 1 1 2 66 AB123 1 1 3 67 CD321 1 1 1 68 CD321 1 1 2 

C'est le meilleur que j'ai trouvé, mais il ne semble pas très efficace.

 select ID from #table where Code = (Select Code from #table where ID = @Port1) and Life = (Select Life from #table where ID = @Port1) and TC = (Select TC from #table where ID = @Port1) 

Voici la requête dont vous avez besoin:

 select t2.* from #table t1 join #table t2 on t1.Code = t2.Code and t1.Life = t2.Life and t1.TC = t2.TC and t1.PORT = t2.PORT where t1.id = @Port1 

Avec cross apply :

 select ca.* from #table t1 cross apply (select * from #table t2 where t1.Code = t2.Code and t1.Life = t2.Life and t1.TC = t2.TC and t1.PORT = t2.PORT) ca where where t1.id = @Port1 

Avec cte :

 with cte as(select * from #table where id = @Port1) select t.* from #table t join cte c on t.Code = c.Code and t.Life = c.Life and t.TC = c.TC and t.PORT = c.PORT 

Vous pouvez utiliser une instruction EXIST pour ce scénario

 SELECT ID FROM #table t1 WHERE EXISTS ( SELECT * FROM #table t2 WHERE t2.ID = @Port1 AND t2.Code = t1.Code AND t2.Life = t1.Life AND t2.TC = t1.TC ) 

Votre code semble fournir le même résultat

 SELECT ID FROM #table AS tbl1 INNER JOIM#table AS tbl2 on tbl2.ID =@Port1 AND tbl1.Life =tbl2.Life AND tbl1.TC =tbl2.TC 

mais c'est plus cher Vous requestz toujours le même logging dans les sélections sous la clause where. Ensuite, chaque fois que vous choisissez un champ différent pour correspondre. Mais faites attention car s'il y a plus d'un logging avec cet ID, votre requête donne une erreur parce que, puisque vous avez utilisé l'opérateur =, elle n'attend qu'une seule instance du champ que vous vérifiez.

En utilisant les fonctions de la window:

 ;WITH CTE AS ( SELECT *, RANK() OVER (ORDER BY [Code], [Life], [TC]) AS grp FROM mytable ), CTE2 AS (SELECT grp FROM CTE WHERE ID = @Port1) SELECT * FROM CTE WHERE grp = (SELECT grp FROM CTE2) 

La requête ci-dessus trouve les partitions [Code], [Life], [TC] auxquelles appartient ID = @Port1 , puis sélectionne toutes les lignes de cette partition.