我是否需要SQL视图上的子查询?

时间:2016-05-12 14:36:51

标签: sql sql-server tsql sql-view

我创建了查询的第一部分,显示了当前等待发送给客户的产品总数。从Item表 -

返回项目编号
SELECT
  [Item].[ItemNum],
  SUM([Sales].[Quantity]) AS [Qty]
FROM [dbo].[Item]
LEFT OUTER JOIN [dbo].[Sales]
  ON [Item].[ItemNum] = [Sales].[ItemNum]
WHERE ([Sales].[Sale Type] = 1)
GROUP BY [Item].[ItemNum]

这很好用,我得到了商品的目录号以及订购的商品数量。现在我需要加入另一张桌子,这张桌子显示了我的物品库存。这就是查询的样子 -

SELECT
  [Item].[ItemNum] SUM ([Sales].[Quantity]) AS [Qty], SUM ([Stock].[Remaining Quantity])
AS [Free Stock]
FROM [dbo].[Item]
LEFT OUTER JOIN dbo.[Sales]
  ON [Item].[ItemNu]m = [Sales].[ItemNum]
LEFT OUTER JOIN [dbo].[Stock]
  ON [Item].[ItemNum] = [Stock].[ItemNum]
WHERE ([Sales].[Document Type] = 1)
GROUP BY [Item].[ItemNum]

现在订单上的数量已经消失,库存数量也是错误的。由于我将'where'应用于销售表但不适用于库存表,我是否需要将其移出?

由于

2 个答案:

答案 0 :(得分:1)

我不知道它是否能解决你的问题,但是where子句将你的左连接变成了一个内连接。试试这个。

SELECT
  dbo.[databasename$Item].ItemNum, SUM (dbo.[databasename$Sales].Quantity) AS [Qty], SUM (dbo.[databasename$Stock.[Remaining Quantity])
AS [Free Stock]
FROM dbo.[databasename$Item]
LEFT OUTER JOIN dbo.[databasename$Sales]
  ON dbo.[databasename$Item].ItemNum = dbo.[databasename$Sales].ItemNum
  AND (dbo.[databasename$Sales].[Document Type] = 1)
LEFT OUTER JOIN dbo.[databasename$Stock]
  ON dbo.[databasename$Item].ItemNum = dbo.[databasename$Stock].[ItemNum]
GROUP BY dbo.[databasename$Item].ItemNum

试试这个并查看它是否解决了问题:

SELECT
  dbo.[databasename$Item].ItemNum, [databasename$Sales].Quantity) AS [Qty], [databasename$Stock.[Remaining Quantity])
AS [Free Stock]
FROM dbo.[databasename$Item]
LEFT OUTER JOIN (select ItemNum, sum(quantity) as Quantity from dbo.[databasename$Sales] where Document Type = 1group by ItemNum) as databasename$Sales
  ON dbo.[databasename$Item].ItemNum = [databasename$Sales].ItemNum
LEFT OUTER JOIN (select ItemNum, sum(quantity)  as RemainingQuantity from dbo.[databasename$Stock]roup by ItemNum)
as databasename$Stock
  ON dbo.[databasename$Item].ItemNum = [databasename$Stock].[ItemNum]
GROUP BY dbo.[databasename$Item].ItemNum

答案 1 :(得分:0)

在这种情况下,Common Table Expression很有用:

With CTE As (
SELECT
  [Item].[ItemNum],
  SUM([Sales].[Quantity]) AS [Qty]
FROM [dbo].[Item]
LEFT OUTER JOIN [dbo].[Sales]
  ON [Item].[ItemNum] = [Sales].[ItemNum]
WHERE ([Sales].[Sale Type] = 1)
GROUP BY [Item].[ItemNum]
 )
  Select *
    From CTE Left Outer Join
     [dbo].[Stock]
  ON [CTE].[ItemNum] = [Stock].[ItemNum]