在 sql 语句中使用多个子查询
Using several subqueries in sql statement
我正在尝试使用多个子查询,但出现错误。如果我删除第二个子查询,它会起作用。
错误:
Msg 512, Level 16, State 1, Line 2 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
USE SUPERSTARIS
SELECT lines.Item,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.Allocated,
Inventory.CostPrice,
replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
Inventory.Optional3 AS StockStatus,
(SELECT SUM(l.Invoiced) * -1
FROM lines l
WHERE l.Date >= '2014-01-01'
AND l.Date <= '2014-01-31'
AND l.Item = lines.Item) AS QtySoldInPeriod,
(SELECT SUM(lines.AmountBase-lines.CostAmount)*-1
FROM lines l
WHERE l.Date >= '2014-01-01'
AND l.Date <= '2014-01-31'
AND l.Item = lines.Item) AS QtySoldInPeriod2
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE lines.Invoiced < 0
AND Inventory.Status = 0
AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
Inventory.Optional3,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.CostPrice,
vInventoryOptional2Values.Value,
Inventory.Allocated
正如 Coder of Code 所写,错误是您在子查询中引用了主查询 table 而不是子查询 table。这样您就可以快速更正您的错误。
但是您已经在主查询中按 lines.item 分组,因此您不需要额外的子查询来获取 SUM。
您可以简化查询 - 删除子查询:
USE SUPERSTARIS
SELECT lines.Item,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.Allocated,
Inventory.CostPrice,
replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
Inventory.Optional3 AS StockStatus,
-SUM(lines.Invoiced) AS QtySoldInPeriod,
-SUM(lines.AmountBase-lines.CostAmount) AS QtySoldInPeriod2
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE lines.Invoiced < 0
AND lines.Date >= '2014-01-01'
AND lines.Date <= '2014-01-31'
AND Inventory.Status = 0
AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
Inventory.Optional3,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.CostPrice,
vInventoryOptional2Values.Value,
Inventory.Allocated
并做进一步优化:
USE SUPERSTARIS
SELECT Inventory.Item,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.Allocated,
Inventory.CostPrice,
replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
Inventory.Optional3 AS StockStatus,
l.QtySoldInPeriod,
l.QtySoldInPeriod2
FROM (
SELECT lines.item,
-SUM(lines.Invoiced) AS QtySoldInPeriod,
SUM(lines.CostAmount - lines.AmountBase) AS QtySoldInPeriod2
FROM lines
WHERE lines.Invoiced < 0
AND lines.Date >= '2014-01-01'
AND lines.Date <= '2014-01-31'
GROUP BY Lines.Item) l
INNER JOIN inventory ON l.item = Inventory.item
AND Inventory.Status = 0
AND Inventory.Optional3 <> 3
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
我正在尝试使用多个子查询,但出现错误。如果我删除第二个子查询,它会起作用。
错误:
Msg 512, Level 16, State 1, Line 2 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
USE SUPERSTARIS
SELECT lines.Item,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.Allocated,
Inventory.CostPrice,
replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
Inventory.Optional3 AS StockStatus,
(SELECT SUM(l.Invoiced) * -1
FROM lines l
WHERE l.Date >= '2014-01-01'
AND l.Date <= '2014-01-31'
AND l.Item = lines.Item) AS QtySoldInPeriod,
(SELECT SUM(lines.AmountBase-lines.CostAmount)*-1
FROM lines l
WHERE l.Date >= '2014-01-01'
AND l.Date <= '2014-01-31'
AND l.Item = lines.Item) AS QtySoldInPeriod2
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE lines.Invoiced < 0
AND Inventory.Status = 0
AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
Inventory.Optional3,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.CostPrice,
vInventoryOptional2Values.Value,
Inventory.Allocated
正如 Coder of Code 所写,错误是您在子查询中引用了主查询 table 而不是子查询 table。这样您就可以快速更正您的错误。 但是您已经在主查询中按 lines.item 分组,因此您不需要额外的子查询来获取 SUM。
您可以简化查询 - 删除子查询:
USE SUPERSTARIS
SELECT lines.Item,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.Allocated,
Inventory.CostPrice,
replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
Inventory.Optional3 AS StockStatus,
-SUM(lines.Invoiced) AS QtySoldInPeriod,
-SUM(lines.AmountBase-lines.CostAmount) AS QtySoldInPeriod2
FROM lines
INNER JOIN inventory ON lines.item = Inventory.item
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID
WHERE lines.Invoiced < 0
AND lines.Date >= '2014-01-01'
AND lines.Date <= '2014-01-31'
AND Inventory.Status = 0
AND Inventory.Optional3 <> 3
GROUP BY Lines.Item,
Inventory.Optional3,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.CostPrice,
vInventoryOptional2Values.Value,
Inventory.Allocated
并做进一步优化:
USE SUPERSTARIS
SELECT Inventory.Item,
Inventory.ItemAlternative,
Inventory.OnHandPhys,
Inventory.Allocated,
Inventory.CostPrice,
replace(vInventoryOptional2Values.Value, '/', '') AS Brand,
Inventory.Optional3 AS StockStatus,
l.QtySoldInPeriod,
l.QtySoldInPeriod2
FROM (
SELECT lines.item,
-SUM(lines.Invoiced) AS QtySoldInPeriod,
SUM(lines.CostAmount - lines.AmountBase) AS QtySoldInPeriod2
FROM lines
WHERE lines.Invoiced < 0
AND lines.Date >= '2014-01-01'
AND lines.Date <= '2014-01-31'
GROUP BY Lines.Item) l
INNER JOIN inventory ON l.item = Inventory.item
AND Inventory.Status = 0
AND Inventory.Optional3 <> 3
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID