Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回多个结果的子查询_Sql_Sql Server - Fatal编程技术网

Sql 返回多个结果的子查询

Sql 返回多个结果的子查询,sql,sql-server,Sql,Sql Server,我对SQL还是相当陌生,我最近创建的存储过程不断告诉我,子查询返回多个结果,但我不知道哪一个是问题所在。如果有人有时间告诉我我错过了什么,我将不胜感激 谢谢 SELECT DISTINCT a.customer_no [id], x.esal1_desc [constituent], a.perf [activity], a.sp_act_dt [activity_date], c.description[activity_typ

我对SQL还是相当陌生,我最近创建的存储过程不断告诉我,子查询返回多个结果,但我不知道哪一个是问题所在。如果有人有时间告诉我我错过了什么,我将不胜感激

谢谢

SELECT  DISTINCT a.customer_no [id],
        x.esal1_desc [constituent],
        a.perf [activity],
        a.sp_act_dt [activity_date],
        c.description[activity_type],
        d.display_name_tiny [solicitor],
        s.description [status],
        ISNULL(a.num_attendees,0)[attending],
        a.notes [notes],
        e.address [email]
FROM   [dbo].t_special_activity a
        left outer join [dbo].tr_special_activity_status s ON s.id = a.status
        left outer join [dbo].tr_special_activity c ON c.id = a.sp_act
        left outer JOIN [dbo].FT_CONSTITUENT_DISPLAY_NAME() d ON a.worker_customer_no = d.customer_no
        left outer JOIN [dbo].T_EADDRESS e on a.customer_no=e.customer_no and primary_ind='Y'
        left outer JOIN [dbo].TX_CUST_SAL x on a.customer_no=x.customer_no and default_ind='Y'
WHERE a.status IN (ISNULL(@status, (SELECT DISTINCT id FROM TR_SPECIAL_ACTIVITY_STATUS)))  
    AND a.sp_act_dt BETWEEN (ISNULL(@activity_start,(SELECT MIN(sp_act_dt) FROM T_SPECIAL_ACTIVITY))) 
        AND (ISNULL(@activity_end,(SELECT MAX(sp_act_dt) FROM T_SPECIAL_ACTIVITY)))
    AND ((ISNULL(@list,0) = 0) OR EXISTS (SELECT customer_no FROM T_LIST_CONTENTS lc WITH (NOLOCK)
        WHERE a.customer_no = lc.customer_no and lc.list_no = @list))

唉,您不能使用此表达式:

WHERE a.status IN (ISNULL(@status, (SELECT DISTINCT id FROM TR_SPECIAL_ACTIVITY_STATUS)))
子查询位于需要单个值的位置。无论如何,我认为你想要:

WHERE @status IS NULL OR
      a.status IN (SELECT id FROM TR_SPECIAL_ACTIVITY_STATUS)
请注意,select distinct在in子句中是不相关的。充其量它什么也不做;在最坏的情况下,它会阻碍优化器


我意识到这有点令人困惑。您认为IN接受一个列表,该列表甚至可以是一个子查询。但是,列表的元素是标量而不是列表。因此,当子查询是列表的一个元素时,则假定它是单个值。

唉,您不能使用此表达式:

WHERE a.status IN (ISNULL(@status, (SELECT DISTINCT id FROM TR_SPECIAL_ACTIVITY_STATUS)))
子查询位于需要单个值的位置。无论如何,我认为你想要:

WHERE @status IS NULL OR
      a.status IN (SELECT id FROM TR_SPECIAL_ACTIVITY_STATUS)
请注意,select distinct在in子句中是不相关的。充其量它什么也不做;在最坏的情况下,它会阻碍优化器


我意识到这有点令人困惑。您认为IN接受一个列表,该列表甚至可以是一个子查询。但是,列表的元素是标量而不是列表。因此,当子查询是列表中的一个元素时,则假定它是单个值。

Ahh…这很有意义…仍在尝试将C转换为SQL,并意识到有时我的逻辑计算不正确…谢谢!啊…这很有道理…仍然在尝试从C转换到SQL,并且意识到有时我的逻辑计算不正确…谢谢!我确信从TR_特殊_活动_状态中选择DISTINCT id返回的行数超过1行。ISNULL@status,从TR_特殊_活动中选择不同的id_状态是您获得该错误的位置。在我进一步了解@status是如何生成的之前,我无法真正告诉您该怎么做。我确信从TR_SPECIAL_ACTIVITY_status中选择DISTINCT id返回多行。ISNULL@status,从TR_特殊_活动中选择不同的id_状态是您获得该错误的位置。在我进一步了解@status是如何生成的之前,我无法真正告诉您该怎么做