2009-04-08 8 views
0

私は2つのテーブルを特定の方法で結合する必要があります。私は自分の質問が正しいと思っていますが、わかりません。 TABLE1からSQL:3個の自己結合し、それらを一緒に結合する

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 

私は日付> 2009年1月1日

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

は、だから私はTABLE1から望む結果がこれであるべき明確なユーザーIDたい:私はその後、したい

userID 
1 
2 
3 

をこれを次のようなuser2のtable2に参加させてください:

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 

私はこの結果を表2にTABLE1に参加したい:

つまり
userID Unit Demo 
1   B  X 
2   B  Z 


その後、質問=最高カウンター
ためのユニットと
は、表2から明確なユーザーIDを選択しtable2のから個別のユーザーIDを選択しますここで質問=最高のカウンターのデモ。

私がしたことは、3つの自己結合がそれら3つを一緒に結合したと思います。

あなたはそれが正しいと思いますか?

+0

あなたはどのようなRDBMSを使用していますか? – Quassnoi

+0

"それは正しいと思いますか?" - それを実行したときに正しい答えを出しましたか? – JohnFx

+0

私はそれが私に正しい答えを与えていると思う、私はちょうどあなたがそれに間違って何かを見ることができるかと思っていた。私たちはSQL 2005にあります。ありがとう –

答えて

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

インデックスがtable2 (userID, question, counter)の場合、このクエリが大幅に改善されます。

あなたがSQL Server 2005を述べたので、次のことがより簡単に、より効率的になります。

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 

集約する:

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

これを実行しようとすると、エラーが発生します。無効な列名 'maxcnt'。 私はSQL Server管理スタジオで働いています。また、テーブル全体の全体的な最大数ではなく、それぞれの "userIDとQuestion"の最大数が必要です。それはできますか? –

+0

ありがとうございますが、まだ問題があります。私はトップラインを*に変更して、すべてのデータが返されるのを見ることができました。 userID列を除くすべての列のすべてのレコードはnullです。データなし!いくつかあるはずです。 –

+0

あなたはTOP 1の最後のクエリについて話していますか? – Quassnoi