SQL:子查询返回了多个值
我正在从事基于Saas的项目。其中,它们提供了将SQL查询作为子查询写入Where子句以获取表的匹配数据。我的问题是,我只能在Where子句中编写子查询,因此无法修改outerquerySQL:子查询返回了多个值,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我正在从事基于Saas的项目。其中,它们提供了将SQL查询作为子查询写入Where子句以获取表的匹配数据。我的问题是,我只能在Where子句中编写子查询,因此无法修改outerquery select T.TransactionID, T.DateCreated from xt2010_PARTICIPANTS T -- **I cannot modify this** where --**I can modify whatever inside the Where Cla
select
T.TransactionID, T.DateCreated
from
xt2010_PARTICIPANTS T -- **I cannot modify this**
where --**I can modify whatever inside the Where Clause**
((ParticipantID in (select
case
when dbo.UserIsInRole({CurrentRole}, "1")
then (select ParticipantID
from xt2010_PARTICIPANTS p
where p.DivisionID = T.[DivisionID]
and p.ParticipantID = T.[ParticipantID])
else (select p.ParticipantID
from xt2010_PARTICIPANTS p
inner join xt2010_PARTICIPANTSUPPORT ps on p.ParticipantID = ps.ParticipantID
inner join xt2010_CONTACTS c on c.DivisionID = p.DivisionID
and c.ContactID = ps.ContactID
where c.UserID = 'John1.Abraham_1@cared_t')
end))
)
我只能更改参与者表Where子句的子查询
我得到一个错误:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
您有两个:
选择参与者ID
来自xt2010\p
其中p.DivisionID=T.[DivisionID]
p.ParticipantID=T.[ParticipantID]
选择p.ParticipantID
来自xt2010\p
内部联接xt2010\U PARTICIPANTSUPPORT p.ParticipantID=ps.ParticipantID上的ps
内部连接xt2010_在c.DivisionID=p.DivisionID上与c接触
c.ContactID=ps.ContactID
其中c.UserID='John1.Abraham_1@cared_t'
一个或两个查询返回多行
你有两个选择。第一是确保它们只返回1行,例如通过收紧条件,或通过添加例如DISTINCT或MAX
但是,由于它们在支持多行的in子句中使用,因此更好的解决方案是重写查询,这样子查询就不会用作表达式
你的主要表达是:
参与者在哪里
当dbo.UserIsInRole{CurrentRole}时选择CASE,然后选择1
...
其他的
...
终止
UserIsInRole表达式与数据无关,用于选择要执行的子查询,因此翻转IN和CASE子句:
其中,当dbo.UserIsInRole{CurrentRole}为1时
参与……时的情况。。。然后1或0结束
其他的
参与……时的情况。。。然后1或0结束
结束=1
查询现在将支持子查询中的多行:
其中,dbo.UserIsInRole{CurrentRole}时为1
那么,当参与者参与时
选择参与者ID
来自xt2010\p
其中p.DivisionID=T.[DivisionID]
p.ParticipantID=T.[ParticipantID]
然后1或0结束
否则,当参与
选择p.ParticipantID
来自xt2010\p
内部联接xt2010\U PARTICIPANTSUPPORT p.ParticipantID=ps.ParticipantID上的ps
内部连接xt2010_在c.DivisionID=p.DivisionID上与c接触
c.ContactID=ps.ContactID
其中c.UserID='John1.Abraham_1@cared_t'
然后1或0结束
结束=1
在我看来,您可能对如何使用IN和CASE语句有些困惑 在研究了一下您的查询之后,我将假设您试图表达的是 当T.ParticipantID位于[第一个子查询]中时,从T返回记录,并且 用户处于[当前角色],或当T.ParticipantID处于[秒]时 子查询]和用户不在[当前角色]中 你需要以不同的方式来组织它
WHERE (
dbo.UserIsInRole({CurrentRole}, "1")
and T.ParticipantID in
(SELECT ParticipantID
FROM xt2010_PARTICIPANTS p
WHERE p.DivisionID = T.[DivisionID]
AND p.ParticipantID = T.[ParticipantID])
)
or
(
not dbo.UserIsInRole({CurrentRole}, "1")
and T.ParticipantID in (
SELECT p.ParticipantID
FROM xt2010_PARTICIPANTS p
INNER JOIN
xt2010_PARTICIPANTSUPPORT ps
ON p.ParticipantID = ps.ParticipantID
INNER JOIN
xt2010_CONTACTS c
ON c.DivisionID = p.DivisionID
AND c.ContactID = ps.ContactID
Where c.UserID = 'John1.Abraham_1@cared_t')
)
这样安排之后,我认为您的第一个子查询是不必要的:您正在查询与主查询表相同的表,并在相同的键上进行匹配!但是我真的不知道你想做什么。错误告诉你问题所在。你不明白吗?然后我们可以尝试详细说明,但是,这不是来自SQL Server的更为神秘的错误消息之一。您的子查询需要返回1行。考虑到我们不知道您是数据模型,也没有任何样本数据、预期结果以及这些结果背后的逻辑,我们无法告诉您正确的解决方案。您有两个子查询:我们无法告诉哪一个子查询存在问题。你知道它是哪一个吗?它们实际上有三个,@AnnL.,只有第一个不会产生错误,因为它用于in.:从xt2010中选择p.ParticipantID\U参与者p内部加入xt2010\U参与者支持p上的ps.ParticipantID=ps.ParticipantID内部加入xt2010\U联系人c在c.DivisionID=p.DivisionID和c.ContactID=ps.ContactID,其中c.UserID='John1.Abraham_1@cared_t“现在实际上正在执行,你的话毫无意义。CASE表达式返回标量值,而不是布尔结果。这将产生另一个错误。@Larnu Dang在PostgreSQL和MySQL上工作,但在Oracle和SQL Server上不工作。