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 .
我正在使用 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 .