SQL:子查询返回了多个值

SQL:子查询返回了多个值,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

我正在从事基于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 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上不工作。