1
votes

Sélection SQL à partir d'une requête de sélection

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 


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

1
votes

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 .


0 commentaires

3
votes

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 


3 commentaires

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 /…