2011-12-15 15 views
2

最初のテーブルの結果が必要な3つのテーブルの結果が必要です。このために、sno(主キー)に基づいてテーブルをリンクするために左外部結合を使用しました。クエリは正常に実行されますが、異なる基準で3番目のテーブルの結果を選択したい場合は、複雑さが増します。複数の条件で動作する左外部結合クエリの訂正

私は結果を取得しようとしていますどのように見たときに問題がクリアされます:

SELECT * FROM tw_main MainTable 
    LEFT OUTER JOIN tw_details TW 
     ON TW.sno = MainTable.sno 
    LEFT OUTER JOIN tw_typedetails CWR 
     ON CWR.sno = MainTable.sno WHERE CWR.twcatname = 'CWR' 
    LEFT OUTER JOIN tw_typedetails OHT 
     ON OHT.sno = MainTable.sno WHERE OHT.twcatname = 'OHT' 
    LEFT OUTER JOIN tw_typedetails DS 
     ON DS.sno = MainTable.sno WHERE DS.twcatname = 'DS'    
    WHERE 
     MainTable.sno = 420; 

を、私は一度だけ3番目の表(tw_typedetails)を使用する場合は、このクエリは正常に動作しますが、私は同じテーブルから別の結果セットが欲しいです異なるWHERE句を使用します。

どのような修正が必要ですか? SQL Server 2008 R2 Expressを使用しています。このクエリは、Crystal Reportsコマンドから実行されるものとします。

答えて

6

あなたはあまりにも多くのwhere句のカップルを持っています。

代わりにandをお試しください。

SELECT * FROM tw_main MainTable 
    LEFT OUTER JOIN tw_details TW 
     ON TW.sno = MainTable.sno 
    LEFT OUTER JOIN tw_typedetails CWR 
     ON CWR.sno = MainTable.sno AND CWR.twcatname = 'CWR' 
    LEFT OUTER JOIN tw_typedetails OHT 
     ON OHT.sno = MainTable.sno AND OHT.twcatname = 'OHT' 
    LEFT OUTER JOIN tw_typedetails DS 
     ON DS.sno = MainTable.sno AND DS.twcatname = 'DS'    
    WHERE 
     MainTable.sno = 420; 
+0

SQL Serverから独立して実行するとクエリが正常に実行されますが、Crystal Reports内で実行するとCWRの結果がDSの結果と重なって表示されます。 OHTの結果は正しく表示されます。 – RKh

3
on句に where句を移動し

LEFT OUTER JOIN tw_details TW 
     ON TW.sno = MainTable.sno 
      AND MainTable.sno = 420 

それともwhere句のnull値許可:

WHERE MainTable.sno is null or MainTable.sno = 420; 
+0

最後に使用した場合、WHERE句は正確ではありませんか? – RKh

+0

私は最初のアプローチを試みましたが、テーブル全体を返します。 – RKh

関連する問題