Je souhaite sélectionner des lignes dans SQL Server, mes questions ci-dessous:
Table2 -------------------------- | Name | Type | -------------------------- | A | 1 | | A | 2 | | A | 3 | | D | 1 | | D | 2 | | D | 3 | | . | . | | . | . |
5 Réponses :
Vous pouvez utiliser string_agg s'il s'agit de SQL Server 2017 et ci-dessus ou Azure SQL comme ci-dessous:
Select * from #yourTable yt join ( select [name], string_agg([Type], ',') as st_types from #YourTable group by [name] ) a on yt.name = a.[name] and a.st_types like '%1,2,3%'
Vous pouvez utiliser interner rejoindre code> S sur les trois
Type CODE> Colonnes pour atteindre cet objectif:
Name Type
A 1
A 2
A 3
D 1
D 2
D 3
Vous pouvez utiliser les fonctions de fenêtre pour cela:
name | type :--- | ---: A | 1 A | 2 A | 3 D | 1 D | 2 D | 3
Obtenir les noms avec s'il y a pour la colonne Groupe par nom CODE> et définissez la condition dans la clause code> code>:
Type code> Autres valeurs que
1, 2, 3 Code> ALORS: P>
> Name | Type
> :--- | ---:
> A | 1
> A | 2
> A | 3
> D | 1
> D | 2
> D | 3
Je vous donne ceci, cela fonctionnera si vous avez:
SELECT * FROM Table1 WHERE Name in ( SELECT Name from ( SELECT Name, Type, count(Name) c from Table1 where Type = 1 GROUP BY Name, Type HAVING count(Name) = 1 UNION SELECT Name, Type, count(Name) c from Table1 where Type = 2 GROUP by Name, Type HAVING count(Name) = 1 UNION SELECT Name, Type, count(Name) c from Table1 where Type = 3 GROUP by Name, Type HAVING count(Name) = 1) t GROUP by name HAVING count(c) = 3)
Solution de @gmb le fait aussi beaucoup plus de code :)