Je veux faire une requête de sélection qui effectue une première sélection, puis utiliser cette sélection pour effectuer une deuxième sélection.
J'ai fait une première version en utilisant une table temporaire mais j'aimerais savoir s'il existe un moyen de faites-le sans la table temporaire
mon code avec la table temporaire est comme:
select dvd_name, book_name , count(*) nb into #t from usr inner join book on usr_book_id = book_id inner join dvd on dvd_id = usr_dvd_id group by dvd_name, book_name having count(*) > 1 select top 10 usr_smthg, #t.book_name,dvd_name from #t inner join book b on b.book_name = #t.book_name inner join usr on usr_book_id = book_id
3 Réponses :
Dans SQL, vous pouvez utiliser une sous-requête, comme ceci:
select top 10 usr.usr_smthg, t.book_name, usr.dvd_name from ( select dvd_name, book_name , count(*) nb from usr inner join book on usr_book_id = book_id inner join dvd on dvd_id = usr_dvd_id group by dvd_name, book_name having count(*) > 1 ) t inner join book b on b.book_name = t.book_name inner join usr on usr_book_id = book_id -- guess order by n.nb desc
Vous pouvez utiliser la fonction de fenêtre avec la sous-requête:
select top (10) t.usr_smthg, t.book_name, t.dvd_name
from (select usr_smthg, book_name, dvd_name,
count(*) over (partition by dvd_name, book_name) as cnt
from usr inner join
book
on usr_book_id = book_id inner join
dvd
on dvd_id = usr_dvd_id
) t
where cnt > 1
order by ??;
?? indique la colonne de tri en fonction de vos besoins premiers (10) enregistrements .
Vous pouvez utiliser CTE pour cela
with t as
(
select dvd_name, book_name , count(*) nb
from usr
inner join book on usr_book_id = book_id
inner join dvd on dvd_id = usr_dvd_id
group by dvd_name, book_name
having count(*) > 1
)
select top 10 usr_smthg, t.book_name,dvd_name
from t
inner join book b on b.book_name = t.book_name
inner join usr on usr_book_id = book_id
d'accord, j'étais assez proche de cela mais je ne connaissais pas le libellé "avec t comme". Merci beaucoup pour votre réponse rapide, je la marque comme réponse acceptée car elle est très proche de mon code. Merci. PS: je ne peux pas modifier car il fait moins de 6 caractères mais dans votre code ce n'est plus #t mais t
@hunB - #t signifie quelque chose de spécifique sur SQL Server - cela s'appelle une table temporaire - cet exemple (ou le mien) ne peut pas utiliser #t à cause de cette.
point virgule avant le avec t également stackoverflow.com/questions / 6938060 /…