2009-04-08 12 views
0

J'ai 2 tables à joindre d'une manière spécifique. Je pense que ma requête est correcte, mais pas sûre.SQL: 3 auto-jointures, puis les joindre ensemble

select t1.userID, t3.Answer Unit, t5.Answer Demo 
FROM  
    table1 t1 
    inner join (select * from table2) t3 ON t1.userID = t3.userID 
    inner join (select * from table2) t5 ON t1.userID = t5.userID 
where 
    NOT EXISTS (SELECT * FROM table1 t2 WHERE t2.userID = t1.userID AND t2.date > t1.date) 
    and NOT EXISTS (SELECT * FROM table2 t4 WHERE t4.userID = t3.userID and t4.counter > t3.counter) 
    and NOT EXISTS (SELECT * FROM table2 t6 WHERE t6.userID = t5.userID and t6.counter > t5.counter) 
    and t1.date_submitted >'1/1/2009' 
    and t3.question = Unit 
    and t5.question = Demo 
order by 
    t1.userID 

De table1 Je veux userID distincte où date> 1/1/2009

table1  
userID Date 
1   1/2/2009 
1   1/2/2009 
2   1/2/2009 
3   1/2/2009 
4   1/1/2008 

donc le résultat que je veux de table1 devrait être ceci:

userID 
1 
2 
3 

Je veux alors joindre ceci sur userID avec table2, qui ressemble à ceci:

table2 
userID question answer counter 
1   Unit  A  1 
1   Demo  x  1 
1   Prod  100  1 
2   Unit  B  1 
2   Demo  Y  1 
3   Prod  100  1 
4   Unit  A  1 
1   Unit  B  2 
1   Demo  x  2 
1   Prod  100  2 
2   Unit  B  2 
2   Demo  Z  2 
3   Prod  100  2 
4   Unit  A  2 

Je veux rejoindre table1 table2 avec ce résultat:

userID Unit Demo 
1   B  X 
2   B  Z 

En d'autres termes,
choisir userID distinct de table2 où la question = Unité pour le plus haut contre
puis
sélectionnez ID utilisateur distinct de table2 où question = Démo pour le plus haut compteur.

Je pense que j'ai fait 3 auto-jonctions, puis j'ai joint ces 3 ensembles.

Pensez-vous que ce soit vrai?

+0

Qu'est-ce que SGBDR utilisez-vous? – Quassnoi

+0

"Pensez-vous que c'est juste?" - At-il donné la bonne réponse quand vous l'avez couru? – JohnFx

+0

Je pense que ça me donne la bonne réponse, je me demandais juste si vous pouviez voir quelque chose de mal avec ça. Nous sommes en SQL 2005. Merci –

Répondre

3
SELECT du.userID, unit.answer, demo.answer 
FROM (
     SELECT DISTINCT userID 
     FROM table1 
     WHERE date > '1/1/2009' 
     ) du 
LEFT JOIN 
     table2 unit 
ON  (userID, question, counter) IN 
     (
     SELECT du.userID, 'Unit', MAX(counter) 
     FROM table2 td 
     WHERE userID = du.userID 
       AND question = 'Unit' 
     ) 
LEFT JOIN 
     table2 demo 
ON  (userID, question, counter) IN 
     (
     SELECT du.userID, 'Demo', MAX(counter) 
     FROM table2 td 
     WHERE userID = du.userID 
       AND question = 'Demo' 
     ) 

Avoir un index sur table2 (userID, question, counter) améliorera grandement cette requête.

Puisque vous avez mentionné SQL Server 2005, ce qui suit sera plus facile et plus efficace:

SELECT du.userID, 
     (
     SELECT TOP 1 answer 
     FROM table2 ti 
     WHERE ti.user = du.userID 
       AND ti.question = 'Unit' 
     ORDER BY 
       counter DESC 
     ) AS unit_answer, 
     (
     SELECT TOP 1 answer 
     FROM table2 ti 
     WHERE ti.user = du.userID 
       AND ti.question = 'Demo' 
     ORDER BY 
       counter DESC 
     ) AS demo_answer 
FROM (
     SELECT DISTINCT userID 
     WHERE date > '1/1/2009' 
     FROM table1 
     ) du 

appliqué au total:

SELECT answer, COUNT(*) 
FROM (
     SELECT DISTINCT userID 
     FROM table1 
     WHERE date > '1/1/2009' 
     ) du 
JOIN table2 t2 
ON  t2.userID = du.userID 
     AND t2.question = 'Unit' 
GROUP BY 
     answer 
+0

Lorsque j'essaie d'exécuter ceci, j'obtiens une erreur: Nom de colonne invalide 'maxcnt'. Je travaille dans un studio de gestion de serveur sql. En outre, j'ai besoin du nombre maximum pour chaque "userID et Question", pas le nombre maximum global de la table entière. Peut-il être fait? –

+0

Merci, mais toujours un problème. J'ai changé la ligne du haut pour sélectionner * afin que je puisse voir toutes les données renvoyées. Tous les enregistrements de toutes les colonnes, à l'exception de la colonne userID, sont null. Pas de données! Il devrait y en avoir. –

+0

Vous parlez de la dernière requête avec les TOP 1? – Quassnoi