2012-03-16 16 views
1
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, ',') 

NOW #table2あります1 2 3 4 5 6 7 8 9IN()を条件付き内部結合に置き換えるにはどうすればよいですか?

シナリオ

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を交換しますか?

+0

'のsql = SQL-server' – vol7ron

+0

は、SQLのバージョンにあなたがしているタグを付けてください。を使用して - 例えばMysql、SQL Server、Oracleなど。 – Bridge

答えて

0

クエリで決して定義されていないエイリアス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? 
0

私は誤解していない限りは、表2可能であれば、しかし#表2が空の場合は、すべてあなたが#にマッチした表1 /表2から、すべての行をしたい(それは結局金曜日の午後です) 。 SQL Server 2008では

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

@Idsがnullで、nullでない場合、同じレコードを両方のケースで提供します。 –

0

は、あなたがたとえば、あなたのJOIN句でCASEステートメントを使用することができます!

SELECT * 
FROM table1 
INNER JOIN table2 ON CASE WHEN table1.column1 = 'this' THEN null ELSE 'that' END = table2.column1 
関連する問題