SQL JOIN и LEFT JOIN объединяют одну и ту же таблицу с разными условиями - PullRequest
0 голосов
/ 22 июля 2010

Мне нужно ПРИСОЕДИНЯТЬСЯ к таблице, когда выполняются определенные условия, И ВЛЕВО ПРИСОЕДИНЯТЬСЯ к ней, когда выполняются другие условия. Поскольку я нахожусь в MS Dynamic CRM с фильтрами, я не могу использовать UNION

   SELECT stuff.stuffs
     FROM MainTable    

JOINS othertable
LEFT JOIN othertables

LEFT JOIN TableX as X1 ON (Conditions1.1 = X1.1
                      AND MainTable.Type = 1)    
     JOIN TableX as X2 ON (Conditions2.2 = X2.2
                      AND MainTable.Type = 2)
  • Если я закомментирую часть X2, я получу то, что мне нужно, от части X1 и ничего от X2.
  • Если я покину часть X2, у меня будет дополнительная информация в X2.
  • Если я оставлю это как таковое, я получу то, что мне нужно, от части X2, но ничего от X1.

Я пробовал несколько вариантов, но не могу найти удовлетворительного решения.

РЕДАКТИРОВАТЬ: Мой первоначальный запрос был таким:

SELECT stuff.stuffs
     FROM MainTable

(LEFT) JOIN TableX as X1 
         ON (Conditions1.1 = X1.1
             AND MainTable.Type = 1)    
     OR 
         ON (Conditions2.2 = X2.2
             AND MainTable.Type = 2)

Но если это как левое соединение, я получаю дополнительную информацию от X2 и JOIN дают мне недостающую информацию из X1,

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Фактическое необходимое соответствие не ясно в ОП, но вы можете попробовать что-то вроде:

Select stuff.stuffs
From MainTable
    Left Join TableX As X1
        On ( MainTable.Type = 1 And X1.1 = ...)
            Or ( MainTable.Type = 2 And X1.2 = ...)

Учитывая, что вы добавили в ОП и в комментариях, все еще не ясно, ищите ли выстроки из TableX, которые удовлетворяют либо условию, либо одному и только одному из условий.Тем не менее, для полноты вот что:

Любое условие: мое оригинальное решение выше и решение, добавленное вами к вашему сообщению.

Одно и только одно из условий:

Select stuff.stuffs
From MainTable
    Left Join TableX As X1
        On X1.1 = ...
    Left Join TableX As X2
        On X2.2 = ...
Where ( MainTable.Type = 1 And X1.PK Is Not Null And X2.PK Is Null )
    Or ( MainTable.Type = 2 And X2.PK Is Not Null And X1.PK Is Null )

В оригинальном сообщении отсутствует какое-либо понятие ссылок на внешние ключи из TableX в MainTable.Таким образом, как правило, я бы подумал что-то вроде:

Select stuff.stuffs
From MainTable
    Left Join TableX As X1
        On X1.FK = MainTable.PK
    Left Join TableX As X2
        On X2.FK = MainTable.PK
Where ( MainTable.Type = 1 And X1.Col1 = ...  And X2.PK Is Null )
    Or ( MainTable.Type = 2 And X2.Col1 = ... And X1.PK Is Null )
1 голос
/ 22 июля 2010

Я думаю, вам нужно попробовать это вместо:

   SELECT stuff.stuffs
     FROM TABLEX x
LEFT JOIN MAINTABLE mt1 ON mt.1 = x.1
                       AND mt.type = 1
LEFT JOIN MAINTABLE mt2 ON mt.2 = x.2
                       AND mt.type = 2
...