我不确定我是否错过了正确搜索,但我无法得到正确的问题
这是类似但不准确的
https://stackoverflow.com/questions/11533636/determining-which-table-to-join-to
实际上我想根据传递给存储过程的参数来决定加入哪个表,case when
不起作用
有点
select * from Table1
left join (case when @Parameter<>NULL Then Table2 else Table3 end) final
on Table1.Col1 = final.Col1
表2和表3具有相同的结构
答案 0 :(得分:7)
我可以想到一些选择:
1:IF ... ELSE
IF @Parameter IS NULL
SELECT *
FROM T1
INNER JOIN T2 ON T1.ID = T2.ID
ELSE
SELECT *
FROM T1
INNER JOIN T3 ON T1.ID = T3.ID
2:动态T-SQL
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = N'SELECT *
FROM T1
INNER JOIN ' + CASE WHEN @Parameter IS NULL THEN N'T2 t' ELSE N'T3 t' END
+ N' ON T1.ID = t.ID';
EXEC sp_executesql @SQL;
3:UNION ALL和子查询。
SELECT *
FROM T1
INNER JOIN
(
SELECT *
FROM T2
WHERE @Parameter IS NULL
UNION ALL
SELECT *
FROM T3
WHERE @Parameter IS NOT NULL
) t ON T1.ID = t.ID
对于最后一个,你必须检查优化器创建的计划,看看它是否表现良好。
您似乎正在寻找代码重用,因此选项2可能是您最好的选择。 T-SQL并不能真正适用于这种多态,但在某些情况下你可以使用变通方法。
退一步说,有一个问题是,如果表格结构相同,那么你应该只使用一张桌子吗?然后,您可以使用@Parameter
来过滤所需的行,而不是尝试创建动态查询。
值得注意的是,在这种情况下,您可以使用ORM等处理应用程序层的代码生成。
答案 1 :(得分:1)
试试这个:
select *
from (
select data.*,
case when selection=1 then t1.ExtraField
when selection=2 then t2.ExtraField
when selection=3 then t3.ExtraField
else NULL
end as ExtraField
from data
left join t1 on t1.key = data.key and selection=1
left join t2 on t2.key = data.key and selection=2
left join t3 on t3.key = data.key and selection=3
) T
where ExtraField is not NULL