SQL Server:左联接下存在的位置

时间:2019-05-12 10:57:09

标签: sql sql-server

无法通过左联接使用代码

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不存在。

2 个答案:

答案 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')