Исправления в запросе левого внешнего соединения для работы с несколькими критериями - PullRequest
2 голосов
/ 15 декабря 2011

Я хочу получить результаты из трех таблиц, в которых должны быть результаты из первой таблицы.Для этого я использовал левое внешнее соединение для связывания таблиц на основе 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 ]

6 голосов
/ 15 декабря 2011

У вас есть пара 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;
3 голосов
/ 15 декабря 2011

Переместите предложение 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...