SQL условный JOIN (внутренний или внешний) - PullRequest
4 голосов
/ 23 ноября 2010

Хотелось бы узнать, можно ли сделать условное утверждение при выборе того, какое объединение сделать. Примером того, что я имею в виду, может быть что-то вроде:

SELECT * FROM Table1
IF (TRUE) THEN INNER JOIN
ELSE (FALSE) THEN OUTER JOIN
END
Table2 ON (SOME CONDITION)

Это, очевидно, не работает, но я думаю, что это лучше иллюстрирует мой вопрос.

Ответы [ 4 ]

4 голосов
/ 23 ноября 2010

Предполагается, что у вас будут одинаковые столбцы как для внутреннего, так и для внешнего

Внешнее объединение, конечно, включает в себя внутреннее объединение: единственное отличие состоит в том, как обрабатываются несоответствующие строки, которые можно отсортировать в предложении WHERE

SELECT
   col1, col2
FROM
   Table1
   LEFT OUTER JOIN
   Table2 ON ... (SOME CONDITION)
WHERE
   (conditional = true AND table2.key IS NOT NULL)
   OR
   (conditional = false AND table2.key IS NULL)

Нет никаких гарантий о производительности с ИЛИ

2 голосов
/ 23 ноября 2010

Нет, но вы можете создать оба объединения, а затем использовать условное выражение, чтобы выбрать, из какого из них вы извлекаете данные для некоторого выходного столбца ...

Select Case When [Some boolean condition]
        Then A.ColumnName
        Else B.ColumnName End as OutputColumnName
   From Table 
     Left Join OneTable As A
        On [Join conditions]
     Left Join OtherTable As B
        On [Join conditions]

Это можно изменить по адресуВаше особое беспокойство [Внутренний, Внешний], таким же образом

  Select Case When [Some boolean condition]
        Then A.ColumnName
        Else B.ColumnName End as OutputColumnName
   From Table 
     [Inner] Join TheTable As A
        On [Join conditions]
     Left [Outer] Join TheTable As B
        On [Join conditions]
0 голосов
/ 23 ноября 2010

Нет. Если это необходимо, вам нужно динамически построить строку запроса и затем выполнить ее. Или просто всегда выполняйте внешнее соединение и выбирайте, какие столбцы на самом деле использовать в вашем интерфейсе, исходя из условия. Трудно сказать, что имеет смысл в любом конкретном случае без дополнительной информации.

0 голосов
/ 23 ноября 2010

Не совсем понятно, что вы ожидаете получить обратно.Ожидаете ли вы, что IF будет работать построчно или один раз для всего запроса?

В любом случае вы можете возможно получить то, что вы хотите, с помощью OUTER JOINи затем отфильтруйте результаты с помощью предложения WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...