左外连接查询中的更正以使用多个条件

时间:2011-12-15 09:59:08

标签: sql sql-server sql-server-2008

我想要来自三个表的结果,其中第一个表的结果必须是。为此,我使用Left Outer Join基于 sno (主键)链接表。查询运行正常,但是当我想从不同标准的第三个表中选择结果时,我会增加复杂性。

在查看我如何检索结果时,问题将会清楚:

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;

如果我只使用第三个表(tw_typedetails)一次,这个查询工作正常,但我想从同一个表中使用不同的WHERE子句的单独结果集。

需要进行哪些更正?我正在使用SQL Server 2008 R2 Express。此查询应该从Crystal Reports命令运行。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

where子句移到on子句:

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

或允许null子句中的where值:

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