Как заменить IN () на Условное внутреннее соединение? - PullRequest
1 голос
/ 16 марта 2012
Table1 (ID, Col1, col2, col3, col4)

Table2 (ID, Col5, col6)

-----------------SP-------------------

set @Ids = '1,2,3,4,5,6,7,8,9' // Input paremeter  (can be NULL)

Create Table #Tabel2
(
     Id int
)
Insert into #table2 select * from dbo.Split(@Ids, ',')

СЕЙЧАС #table2 имеет: 1 2 3 4 5 6 7 8 9

Сценарий

Select t1.Col1,t1.col2,t1.col3 
FROM Table1 as t1 
  INNER JOIN Table2 as t2 ON t1.Col1=t2.Col2
    AND (@Ids is null OR t1.ID in (Select Id from #Table2))

Вопрос

Как заменить IN условным внутренним объединением?

Ответы [ 3 ]

0 голосов
/ 16 марта 2012

Если я не понимаю (в конце концов, сегодня пятница), вы хотите, чтобы все строки из Table1 / Table2 были сопоставлены с # Table2, где это возможно, но все, если # Table2 пусто - это просто внешнее соединение.

SELECT t.Col1,
       t.col2,
       t.col3
FROM   Table1 AS t1
       INNER JOIN Table2 AS t2
         ON t1.Col1 = t2.Col2
       LEFT OUTER JOIN #Table2 t3
         ON t2.ID = t3.ID 
0 голосов
/ 27 марта 2012

В SQL Server 2008 вы можете использовать операторы CASE в предложении соединения, например:

SELECT * 
FROM table1
INNER JOIN table2 ON CASE WHEN table1.column1 = 'this' THEN null ELSE 'that' END = table2.column1
0 голосов
/ 16 марта 2012

Поскольку вы использовали псевдоним t, который никогда не определялся в вашем запросе, мне не ясно, к какой таблице ID следует присоединиться. Я сделал предположение и использовал t1.

Select t1.Col1,t1.col2,t1.col3 
FROM Table1 as t1 
INNER JOIN Table2 as t2 ON t1.Col1=t2.Col2 
left outer join #Table2 ids on @Ids is null or t1.ID = ids.ID --maybe this should be t2.ID = ids.ID?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...