SQL 使用多个子查询作为条件的字段条件

SQL conditional for a field using multiple subqueries as cases

我正在使用 Proc SQL,但这个问题应该与所有 SQL 变体相关。我正在尝试使用两个子查询的值填充字段 BruceDPOtest,如果第一个查询结果为空白 - CASE WHEN BruceDPO = INPUT("", 8.) - 它会用另一个子查询的 BruceDPO 值填充该空白:

THEN (
SELECT SUM(PART_QTY) FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID)
WHERE PUT(PROC_DT, YY.) LIKE '%2016%' GROUP BY PART_NO_ID) ELSE BruceDPO END 

例如,第一个查询给出以下结果;

Part   DPO

1234   100
1235   

引用可以填充第二行的数据的第二个子查询是 运行 get:

Part   DPO

1234   100
1235   999

完整代码如下:

    PROC SQL;
    CREATE VIEW DPOMergeView AS(SELECT *, 
        CASE 
            WHEN BruceDPO = INPUT("", 8.)  THEN (
        SELECT SUM(PART_QTY) FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total
            ON RSCCParts.PartID = STRIP(Total.PART_NO_ID)
        WHERE PUT(PROC_DT, YY.) LIKE '%2016%' GROUP BY PART_NO_ID) 
            ELSE BruceDPO 
        END 
    AS BruceDPOtest
        FROM
            RSCCParts
        LEFT JOIN (SELECT RSCCParts.PartID AS BrucePartID, BruceDPO, Year
            FROM RSCCParts
                LEFT JOIN
                    (SELECT PART_NO_ID AS PartNumber, SUM(PART_QTY) AS BruceDPO, STRIP(YR) AS Year
                        FROM
                            DPO.DPO_PART_HST_MAIN
                        WHERE YR = '2016'
                            GROUP BY PartNumber, Year) AS FQuery
                                ON
                                RSCCParts.PartID = STRIP(FQuery.PartNumber)) AS B
                                ON RSCCParts.PartID = B.BrucePartID);
QUIT;

当我 运行 这个查询时,它卡在数据步上,30 分钟后,我停止了查询。我这样做正确吗?如果有更好的方法,请告诉我!

通常我会避免在 SQL 中使用相关子查询,因为它只会让您感觉您正在尝试逐条记录地处理数据记录,而不是组合集合。但是如果你做了什么来使用像

这样的语法
case when (x) then (sub query result) else variable_name end

那么子查询只需要return一个值。您的查询

SELECT SUM(PART_QTY) 
FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID)
WHERE PUT(PROC_DT, YY.) LIKE '%2016%' 
GROUP BY PART_NO_ID

看起来会 return 多个观察结果,因为您使用的是 GROUP BY 子句。

那个子查询不应该更像

SELECT SUM(Total.PART_QTY) 
FROM DPO.DPO_PART_ORD_HST AS Total
WHERE  RSCCParts.PartID = STRIP(Total.PART_NO_ID)
  AND PUT(PROC_DT, YY.) LIKE '%2016%' 

您的查询有多个对 RSCCPARTS table 的引用,因此您可能需要为每个引用引入一个别名,以便您可以明确要使用哪个来从中获取 PARTID 以匹配 PART_NO_ID .