2009-04-08 3 views
0

Ich habe 2 Tabellen auf eine bestimmte Weise beizutreten. Ich denke meine Anfrage ist richtig, aber nicht sicher.SQL: 3 Self-Joins und dann verbinden sie

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 

Von tabelle1 ich verschiedene userID wollen, wo Datum> 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 

Also das Ergebnis ich aus table1 möchte sein sollte: dann will ich

userID 
1 
2 
3 

zu verbinden Sie dies auf Benutzer-ID mit Tabelle2, die wie folgt aussieht:

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 

Ich möchte mit diesem Ergebnis tabelle1 mit table2 verbinden:

userID Unit Demo 
1   B  X 
2   B  Z 

Mit anderen Worten,
select distinct userID von table2 wo Frage = Einheit für den höchsten Zähler
und dann
select distinct userID von table2 wo Frage = Demo für den höchsten Zähler.

Ich denke, was ich getan habe, ist 3 Self-Joins dann diese 3 zusammengefügt.

Glaubst du, dass es richtig ist?

+0

Welche RDBMS verwenden Sie? – Quassnoi

+0

"Denkst du, es ist richtig?" - Hat es die richtige Antwort gegeben, als du es ausgeführt hast? – JohnFx

+0

Ich denke, es gibt mir die richtige Antwort, ich habe mich nur gefragt, ob du etwas falsch sehen kannst. Wir sind in SQL 2005. Danke –

Antwort

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' 
     ) 

auf table2 (userID, question, counter) einen Index hat, wird diese Abfrage erheblich verbessern.

Da Sie SQL Server 2005 erwähnt, wird die folgende sein einfacher und effizienter:

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 

zu aggregieren:

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

Wenn ich versuche, dies auszuführen, erhalte ich einen Fehler: ungültiger Spaltenname 'maxcnt'. Ich arbeite in SQL Server Management Studio. Außerdem benötige ich die maximale Anzahl für jede "Benutzer-ID und Frage", nicht die Gesamt-Max-Zählung der gesamten Tabelle. Kann es gemacht werden? –

+0

Danke, aber immer noch ein Problem. Ich habe die obere Zeile geändert, um * auszuwählen, damit ich alle zurückgegebenen Daten sehen konnte. Alle Datensätze in allen Spalten außer der Spalte userID sind null. Keine Daten! Es sollte einige geben. –

+0

Sie sprechen über die letzte Abfrage mit TOP 1? – Quassnoi