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.