Sql 返回多个结果的子查询
我对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
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是如何生成的之前,我无法真正告诉您该怎么做