sql server view账户查询出来的表不全

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server view账户查询出来的表不全相关的知识,希望对你有一定的参考价值。

参考技术A 客户端的字符集编码格式不对造成的。
修改方法有多种(环境变量、注册表等),但是环境变量是最简单的,所以通常都是用这个方法。添加环境变量把变量名改为lang就可以了。
如果查询结果当中的一些字段显示结果不全,段A的值不符合要求。显示出来的值是正确结果的一部分。也可以在pls中执行语句,看到查询结果,然后结尾修改成16gbk也可以。

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

【中文标题】在 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账户查询出来的表不全的主要内容,如果未能解决你的问题,请参考以下文章

BIGQUERY:连接谓词中的表不受支持的子查询

Oracle11G 命令行导出表不全解决

如果表不存在,如何运行包含针对另一个 sql 实例上的表的查询的 If-Then-Else 语句?

在没有 VIEW SERVER STATE 权限的情况下查找 SQL Server 2014 中最常访问的表

SQL连接查询

SQL Server进阶表表达式