如果第一个 table 在连接子查询中为空,如何从第二个 table select

How to select from 2nd table if 1st table is empty in the midst of a joined subquery

我有一个查询可以正常工作。它从 12 个月度数据库中提取数据以生成报告。但是,现在我们要每月导入两次数据,而不是每月一次,因此我要再添加 12 个数据库。上半月一个,下半月一个。以“_A”结尾的数据库是前半部分,“_B”是后半部分。我们想要第二部分数据(如果有的话)。如果没有,我们需要上半年的数据。如果“_B”中没有数据,我如何修改我的查询以测试“_B”中的数据和“_A”中的 select?

我试过使用 IF 和 CASE。我用谷歌搜索但没有发现任何可以解决我的情况的东西。希望比我懂SQL的人能帮帮忙。

这是仅从“_B”数据库中提取的当前 SQL:

SELECT      JanAct.DDName, 
            JanAct.JanActual, 
            FebAct.FebActual, 
            MarAct.MarActual, 
            AprAct.AprActual, 
            MayAct.MayActual, 
            JunAct.JunActual, 
            JulAct.JulActual, 
            AugAct.AugActual, 
            SepAct.SepActual, 
            OctAct.OctActual, 
            NovAct.NovActual, 
            DecAct.DecActual
FROM       (SELECT DDName, [% Eff] AS JanActual FROM TIP_2_Jan_B.dbo.V_DDSum) AS JanAct
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS DecActual FROM TIP_2_Dec_B.dbo.V_DDSum) AS DecAct ON JanAct.DDName = DecAct.DDName
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS NovActual FROM TIP_2_Nov_B.dbo.V_DDSum) AS NovAct ON JanAct.DDName = NovAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS OctActual FROM TIP_2_Oct_B.dbo.V_DDSum) AS OctAct ON JanAct.DDName = OctAct.DDName
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS SepActual FROM TIP_2_Sep_B.dbo.V_DDSum) AS SepAct ON JanAct.DDName = SepAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS AugActual FROM TIP_2_Aug_B.dbo.V_DDSum) AS AugAct ON JanAct.DDName = AugAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS JulActual FROM TIP_2_Jul_B.dbo.V_DDSum) AS JulAct ON JanAct.DDName = JulAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS JunActual FROM TIP_2_Jun_B.dbo.V_DDSum) AS JunAct ON JanAct.DDName = JunAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS MayActual FROM TIP_2_May_B.dbo.V_DDSum) AS MayAct ON JanAct.DDName = MayAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS AprActual FROM TIP_2_Apr_B.dbo.V_DDSum) AS AprAct ON JanAct.DDName = AprAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS FebActual FROM TIP_2_Feb_B.dbo.V_DDSum) AS FebAct ON JanAct.DDName = FebAct.DDName 
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS MarActual FROM TIP_2_Mar_B.dbo.V_DDSum) AS MarAct ON JanAct.DDName = MarAct.DDName

应该是这样的。

SELECT      JanAct.DDName, 
            ...
            DecActual = isnull(DecAct.DecActual, DecAct_A.DecActual)
FROM       (SELECT DDName, [% Eff] AS JanActual FROM TIP_2_Jan_B.dbo.V_DDSum) AS JanAct
            ...    
            FULL OUTER JOIN (SELECT DDName, [% Eff] AS DecActual FROM TIP_2_Jan_A.dbo.V_DDSum) AS DecAct_A ON JanAct.DDName = DecAct_A.DDName

首先创建单个数据集,确定数据的优先级并加入数据变得非常容易。

WITH data(DDName, [% Eff], [Period], [Source])
AS(
    -- A Database
    SELECT DDName, [% Eff], 'JanActual', 'A' FROM TIP_2_Jan_B.dbo.V_DDSum UNION ALL
    SELECT DDName, [% Eff], 'FebActual', 'A' FROM TIP_2_Feb_B.dbo.V_DDSum UNION ALL
    SELECT DDName, [% Eff], 'MarActual', 'A' FROM TIP_2_Mar_B.dbo.V_DDSum UNION ALL
    SELECT DDName, [% Eff], 'AprActual', 'A' FROM TIP_2_Apr_B.dbo.V_DDSum UNION ALL

    -- B databases
    SELECT DDName, [% Eff], 'JanActual', 'B' FROM TIP_2_Jan_B.dbo.V_DDSum UNION ALL
    SELECT DDName, [% Eff], 'FebActual', 'B' FROM TIP_2_Feb_B.dbo.V_DDSum UNION ALL
    SELECT DDName, [% Eff], 'MarActual', 'B' FROM TIP_2_Mar_B.dbo.V_DDSum UNION ALL
    SELECT DDName, [% Eff], 'AprActual', 'B' FROM TIP_2_Apr_B.dbo.V_DDSum
),
PrioritizedData AS(
    SELECT *, [Priority] = ROW_NUMBER() OVER (PARTITION BY DDName, [% Eff], [Period] ORDER BY [Source] DESC)
    FROM data
),
SelectTopPrioData AS(
    SELECT * FROM PrioritizedData
    WHERE [Priority] = 1
)
SELECT * 
FROM SelectTopPrioData
PIVOT
(
    MAX([% Eff])
    FOR [Period] IN ([JanActual], [FebActual], [MarActual], [AprActual])
) AS PivotTable;

使用动态SQL:

 declare @sel varchar(max)

set @sel = ' SELECT
         .......
         FROM         '

 if (SELECT COUNT(*) FROM   TTIP_2_Jan_B.dbo.V_DDSum)  =0
   begin
     set @sel = @sel+'SELECT DDName, [% Eff] AS DecActual FROM TIP_2_Jan_A.dbo.V_DDSum'
   END
   ELSE 
   BEGIN
    set @sel = @sel+'SELECT DDName, [% Eff] AS DecActual FROM TIP_2_Jan_B.dbo.V_DDSum'
END

exec(@sel)