无法通过左联接使用代码
LEFT JOIN
(SELECT
CASE
WHEN EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TABLE_A')
THEN
SELECT q23.MRID, q23.NTP
FROM
(SELECT MRID, NSIA4 NTP FROM TABLE_A a, TABLE_B b
WHERE a.obj = b.co
UNION
SELECT MRID, CASE WHEN a.NBR = 0 then NTPSERV END NTP FROM TABLE_C a, TABLE_B b WHERE a.obj = b.co) q23
ELSE SELECT q23.MRID , q23.NTP from ( SELECT MRID, CASE WHEN a.NBR = 0 then NTPSERV END NTP FROM TABLE_C a, TABLE_B b WHERE a.obj = b.co) q23
END ) q24 ON q0.MRID = q24.MRID
这将合并两个表中的结果并将它们显示为并集。由于我们有多个数据库,并且在某些数据库中,TABLE_A不存在。
答案 0 :(得分:0)
您似乎混淆了SQL中的不同概念。 CASE
表达式恰好是:一个标量表达式。它返回具有特定类型的列值。它不是控制流,而是数据流(即,它仅对查询中的数据进行操作)。
SQL查询引用特定的表和列。除非您在T-SQL中使用动态SQL,否则它们不能是动态的或有条件的。 T-SQL是一种脚本语言,它支持条件控制流逻辑:
declare @sql nvarchar(max);
if exists (select 1 from information_schema.tables where table_name = 'Table_a')
begin
@sql = 'select col from table_a';
end;
else
begin
@sql = 'select col from table_b';
end;
exec sp_executesql @sql;
答案 1 :(得分:0)
只需一个语句,您就可以查询
execute(N'
DECLARE @sql nvarchar(max) = N''
...
... YOUR QUERY SO FAR UNTIL THE LEFT JOIN
...
LEFT JOIN
('' +
CASE
WHEN EXISTS(SELECT * FROM information_schema.tables WHERE table_name = ''TABLE_A'')
THEN ''
SELECT mrid, nsia4 ntp
FROM table_a a, table_b b
WHERE a.obj = b.co
----------
UNION
----------''
ELSE ''''
END +
''
SELECT
mrid,
CASE WHEN a.nbr = 0 THEN ntpserv
END ntp
FROM table_c a, table_b b
WHERE a.obj = b.co
) q24
on q0.mrid = q24.mrid
...
... THE REST OF THE QUERY
...''
execute sp_executesql @sql')