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

RKh*_*RKh 2 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*son 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;
Run Code Online (Sandbox Code Playgroud)