[英]LEFT JOIN with case condition under it
我有一个使用@Table1.ColumnName
(列的名称)作为输入参数的存储过程。 这是存储过程中的查询:
select data
from Table1
case @Table1.ColumnName = 'Table1.column1'
THEN LEFT JOIN Table2 (on Table1.column1 = Table2.column1)
case @Table1.ColumnName = 'Table1.column2'
THEN LEFT JOIN Table2
(on Table1.column2 = Table2.column1)
我需要通过检查输入参数@Table1.ColumnName
在存储过程中进行左连接。 我需要在联接中更改ON
条件。
我不确定语法。 任何人都可以帮助我如何编写带有条件的左连接。
您不能只做两个左联接,因为@ table1.column1变量不能同时匹配两个,您知道您只会在其中一个中得到结果。 并且您始终可以合并结果,以便从t2,t3获得非空值(下面的col1示例)
SELECT t1.*, coalesce(t1.column1, t2.column1) as Col1
FROM Table1 t1
LEFT JOIN table2 t2
on T1.column1 = t2.column1
and @table1.column1 = 'Table1.column1'
LEFT JOIN table3 t3
on T1.column2 = t3.column1
and @table1.column2 = 'Table1.column2'
否则,我相信您必须使用动态SQL来完成您要执行的任务。
或者我想您可以将一个空白结果与一个结果相结合...
SELECT data
FROM Table1
LEFT JOIN table2
(on Table1.column1 = Table2.column1)
WHERE @Table1.ColumnName = 'Table1.column1'
UNION ALL
SELECT data
FROM Table1
LEFT JOIN Table2
(on Table1.column2 = Table2.column1)
WHERE @Table1.ColumnName = 'Table1.column2'
您可以为此使用动态sql:
declare @sql nvarchar(max);
set @sql = '
select data
from Table1
left join Table2
on Table2.column1 = ';
if @Table1.ColumnName = 'Table1.column1'
begin;
set @sql = @sql + 'Table1.column1';
end;
if @Table1.ColumnName = 'Table1.column2'
begin;
set @sql = @sql + 'Table1.column2';
end;
exec sp_executesql @sql;
参考:
您可以尝试这样的事情。
SELECT data
FROM Table1
LEFT JOIN Table2 ON
@Table1.ColumnName = 'Table1.column1'
AND Table1.column1 = Table2.column1
LEFT JOIN Table2 ON
@Table1.ColumnName = 'Table1.column2'
AND Table1.column2 = Table2.column1
尝试此代码,基于参数@ColName
,您将使用不同的连接条件
declare @ColName int = 'FieldNameHere'
select *
from Table1
left join Table2
on (Table1.column1 = Table2.column1 and @ColName = 'FieldNameHere')
or (Table1.column2 = Table2.column2 and @ColName <> 'FieldNameHere')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.