查询以选择distinct

时间:2010-10-11 08:10:38

标签: sql sql-server sql-server-2005

你好朋友,

我需要一个查询来与表 temp_invoice进行比较时抛出错误消息。

它应将[任务分配#]字段与 PB_Responsbility 表中[PB-ID]字段的客户= 3D进行比较

temp_invoice格式

Concession Number   [Task resp#]

   TH-123                 12345
   TH-014                 98065
   TH-123                 41027
   TH-567                 12345
   TH-111                 99765
   TH-567                 41027             
   TH-228                 73095             
   TH-001                 09129             
   TH-779                 41027         
   TH-333                 01029     
   TH-722                 03489  

这应检查客户为3D的数据库表。

表PB_Responsbility

[PB-ID]                      Customer
  09129                        3D
  98065                        AB
  12345                        DC
  41027                        ZH
  99765                        3D
  73095                        UZ

如果客户不是3D或者如果在表PB_Responsbility中找不到[Task resp#],  它应该抛出一条消息,通过选择不同的[任务分配#]  来自excel表。

此处所需输出为“不正确[任务分配#]: - 12345,98065,41027,73095,01029,03489。

我已经编写了查询,

DECLARE @pb_id_msg VARCHAR(MAX)
SET @pb_id_msg = ''

SELECT @pb_id_msg =  @pb_id_msg + ' ,'
+ CONVERT(VARCHAR(10),[Task resp#]) FROM temp_invoice WHERE [Task resp#]  NOT IN 
    (SELECT [PB-ID] FROM PB_Responsbility WHERE Customer = '3D')
   GROUP BY CONVERT(VARCHAR(10),[Task resp#]).

这是根据需要产生的结果。但是如果我用DISTINCT修改查询

SELECT DISTINCT @pb_id_msg =  @pb_id_msg + ' ,'
+ CONVERT(VARCHAR(10),[Task resp#]) FROM temp_invoice WHERE [Task resp#]  NOT IN 
    (SELECT [PB-ID] FROM PB_Responsbility WHERE Customer = '3D')

这只会产生1个值。请解释一下,为什么带有distinct的第二个选择查询不起作用?

1 个答案:

答案 0 :(得分:1)

看起来SQL Server解释distinct意味着您只想为变量赋值一次。

您可以通过将distinct移动到子查询来解决这个问题:

SELECT  @pb_id_msg =  @pb_id_msg + ' ,' + CONVERT(VARCHAR(10),[Task resp#]) 
FROM    (
        SELECT  DISTINCT [Task resp#]
        FROM    temp_invoice 
        WHERE   [Task resp#]  NOT IN 
                (
                SELECT  [PB-ID] 
                FROM    PB_Responsbility 
                WHERE   Customer = '3D'
                )
        ) as SubQueryAlias