SQL Server 2005/2008 условное соединение - PullRequest
3 голосов
/ 23 декабря 2010

Есть ли такая вещь, как условное объединение:

SELECT *
FROM TABLE1 A
    IF (a=='TABLE2') THEN INNER JOIN TABLE2 B ON A.item_id=B.id
    ELSE IF (a=='TABLE3') THEN INNER JOIN TABLE3 C ON A.item_id=C.id

Хотя a - это поле в TABLE1.

Мне нравится использовать это в хранимых процедурах без использования динамического sql (без написания запросав виде строки и EXEC (@query)).

РЕДАКТИРОВАТЬ: я не могу написать:

IF (a=='TABLE2) THEN queryA
ELSE IF (a=='TABLE3') THEN queryB

, потому что поле a TABLE1.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

РЕДАКТИРОВАТЬ : Модифицированный ответ на основе комментария ниже:

Вы можете попытаться стать умнее с некоторыми левыми объединениями.Это вернет больше столбцов, так что вы, вероятно, захотите быть более разборчивыми, чем просто SELECT *.

SELECT *
    FROM TABLE1 A
        LEFT JOIN TABLE2 B
            ON A.item_id = B.id
                AND A.a = 'TABLE2'
        LEFT JOIN TABLE3 C
            ON A.item_id = C.id
                AND A.a = 'TABLE3'
    WHERE (B.id IS NOT NULL AND A.a = 'TABLE2')
       OR (C.id IS NOT NULL AND A.a = 'TABLE3')
0 голосов
/ 23 декабря 2010

Обновлен запрос по мере необходимости:

SELECT * FROM
(
    SELECT * 
        FROM TABLE1 A  INNER JOIN TABLE2 B 
            ON A.a='TABLE2' --This will eleminate the table rows if the value of A.a is not 'TABLE2' 
         AND A.item_id=B.id) A,
             (SELECT * FROM
             INNER JOIN TABLE3 C 
            ON A.a='TABLE3' --This will eleminate the table rows if the value of A.a is not 'TABLE3'
            AND A.item_id=C.id 
                ) B
) a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...