在 SQL Server 中编写 VIEW 时需要帮助

Posted

技术标签:

【中文标题】在 SQL Server 中编写 VIEW 时需要帮助【英文标题】:Need Help in Writing VIEW in SQL Server 【发布时间】:2013-04-14 06:56:15 【问题描述】:

我在 SQL Server 中有 2 个表,一个叫做 PO RECEIPT 表,另一个是 Move Order 表。

我需要编写一个查询来将数据插入Receipt 工作正常的表中。收据编号在 Receipt 表中是唯一的,因为它是主键和自动增量,例如,对于 Receipt 数字 1,我收到了 2000 个数量(它是一列)。

如果我想将 500 移动到移动中,下次再移动 500 以获得相同的收据编号。现在我想写一个视图,它将在Move Order 表中添加由Receipt Number 分组的移动数量,并从Receipt 表中的接收数量列中减去这个数量。

目前我编写的这个视图对于相同的Receipt Number 工作正常,但是当Move Order 表中有不同的Receipt Number 时,它会产生错误。观点是

select distinct 
    [5_PO_RECEIPT_TABLE_DATABASE].[Part Number],
    [5_PO_RECEIPT_TABLE_DATABASE].[Receipt Number],
    (select sum([Move_Order].[Move Quantity]) 
     from [Move_Order] 
     group by [Move_Order].[Receipt Number]),
    [5_PO_RECEIPT_TABLE_DATABASE].[Quantity Received] + [Move_Order].[Move Quantity] as TotalQuantity 
from 
    [5_PO_RECEIPT_TABLE_DATABASE]
inner join 
    [Move_Order] on [5_PO_RECEIPT_TABLE_DATABASE].[Receipt Number] = [Move_Order].[Receipt Number]

上面视图产生的错误是

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

【参考方案1】:

好吧,错误很明显:您的子查询((select sum(..) from [Move_order].... 返回多个值 - 如果您在 SELECT 列列表中使用子查询,则不能让子查询返回多个值...

很可能,您只希望 SUM([Move_Order].[Move Quantity]) 与您当前正在查看的那个 Move_Order 对应 - 因此您需要更改子查询以考虑到这一点:

SELECT DISTINCT
    rcpt.[Part Number],
    rcpt.[Receipt Number],
    (SELECT SUM(m.[Move Quantity]) 
     FROM [Move_Order] m
     WHERE m.[Receipt Number] = rcpt.[Receipt Number]),
    rcpt.[Quantity Received] + mo.[Move Quantity] AS TotalQuantity 
FROM
    [5_PO_RECEIPT_TABLE_DATABASE] rcpt
INNER JOIN 
    [Move_Order] mo ON rcpt.[Receipt Number] = mo.[Receipt Number]

我还使用有意义/不言自明的表别名来使查询更具可读性....

所以现在,您的子查询将汇总 [Move Order] 表中当前正在处理的 [Receipt Number] 的所有 [Move Quantity] 值。

【讨论】:

【参考方案2】:

同样在 SQLServer2005+ 中,您可以使用带有OVER() 子句的选项

SELECT DISTINCT
       rcpt.[Part Number],
       rcpt.[Receipt Number], 
       SUM(mo.[Move Quantity]) OVER(PARTITION BY rcpt.[Receipt Number]),
       rcpt.[Quantity Received] + mo.[Move Quantity] AS TotalQuantity
FROM [5_PO_RECEIPT_TABLE_DATABASE] rcpt
  INNER JOIN [Move_Order] mo ON rcpt.[Receipt Number] = mo.[Receipt Number]

顺便说一句,我认为在这种情况下 DISTINCT 关键字过多,因为您在 TotalQuantity 列中的值不同

【讨论】:

以上是关于在 SQL Server 中编写 VIEW 时需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server, VIEW 混淆了数据

C# SQL Server VIEW 查询

使用 VBA 从 SQL Server 查询 VIEW

如何避免两次编写 SQL Server 查询以避免重复?

在 SQL Server 中将数据转换为 XML 时出错

SQL Server 视图的创建- (create view必须是批处理中仅有的语句)