Sql 子查询返回了多个值

Sql 子查询返回了多个值,sql,tsql,Sql,Tsql,我需要选择状态为1的个人联系人 问题在于,一个联系人可以基于4个不同的列同时具有多个状态 活动状态取代非活动状态。如果联系人同时处于活动和非活动状态,则应默认为活动 到目前为止,我的子查询独立运行良好,但当单个联系人在不同列中有2个或多个同时状态时,它们会返回超过1个值 关于如何以1状态返回单个联系人有何想法 SELECT Contact, ((SELECT 'Active' FROM MyTable WHERE Column1 = 1

我需要选择状态为1的个人联系人

问题在于,一个联系人可以基于4个不同的列同时具有多个状态

活动状态取代非活动状态。如果联系人同时处于活动和非活动状态,则应默认为活动

到目前为止,我的子查询独立运行良好,但当单个联系人在不同列中有2个或多个同时状态时,它们会返回超过1个值

关于如何以1状态返回单个联系人有何想法

SELECT Contact,
   ((SELECT 'Active'
     FROM   MyTable
     WHERE  Column1 = 1
             OR Column2 = 1)
    UNION
    (SELECT 'Inactive'
     FROM   MyTable
     WHERE  Column3 = 1
             OR Column4 = 1)) AS MyStatus
FROM   MyTable 

我不完全理解您的问题,我不认为子查询是解决此问题的方法,但您可以尝试以下方法:

SELECT Contact,
       (SELECT TOP 1 ActiveStatus FROM SomeTable WHERE This = 1 AND That = 2 ORDER BY ActiveStatus ASC)
FROM SomeTable
...
你有没有考虑改用它


我还没有运行它,但这至少可以解析并为您指出正确的方向:

select contact, 
case when column1 = 1 or column2 = 1 then 'Active'
     when column3 = 1 or column4 = 1 then 'Inactive'
end
    as 'MyStatus'
from mytable

不太确定您的问题,但您是否在寻找依赖于四列的单个状态行

    SELECT      Contact, 
    CASE 
        WHEN    Column1 = 1  OR Column2 = 1 THEN 'Active'
        WHEN    Column3 = 1  OR Column4 = 1 THEN 'Inactive'
        ELSE    'Unknown'
    END status
    FROM   MyTable

我认为您需要一个案例陈述,而不是子查询

select Contact,
       case when Column1 = 1 or Column2 = 1 then 'Active'
            when Column3 = 1 or Column4 = 1 then 'Inactive'
       end as MyStatus     
from MyTable

您可以使用用例-这应该有效,因为它将按顺序评估条件

SELECT Contact, MyStatus = 
CASE
  WHEN Column1 = 1 THEN 'Active'
  WHEN Column2 = 1 THEN 'Active'
  WHEN Column3 = 1 THEN 'Inactive'
  WHEN Column4 = 1 THEN 'Inactive'
  ELSE 'Unknown'
END
FROM   MyTable

我想你就快到了。您基本上缺少的是关系运算符,例如

SELECT Contact, 'Active' AS MyStatus
  FROM MyTable
 WHERE Column1 = 1
       OR Column2 = 1
UNION
SELECT Contact, 'Inactive'
  FROM   MyTable
  WHERE  Column3 = 1
         OR Column4 = 1
EXCEPT
SELECT Contact, 'Inactive'
  FROM MyTable
 WHERE Column1 = 1
       OR Column2 = 1;

如果某个联系人仅处于活动状态,则该操作将起作用。但如果他不活跃,那么它就不会出现。问题是我需要检查两者。如果两者都存在,则显示active(活动)。这些是您需要检查的唯一状态吗?+1但如果可能存在其他条件,则查询可能不会返回行。至少,这与OP尝试的解决方案所表达的意图是一致的……类似于
…其中1 IN(Column1,Column2,Column3,Column4)
SELECT Contact, 'Active' AS MyStatus
  FROM MyTable
 WHERE Column1 = 1
       OR Column2 = 1
UNION
SELECT Contact, 'Inactive'
  FROM   MyTable
  WHERE  Column3 = 1
         OR Column4 = 1
EXCEPT
SELECT Contact, 'Inactive'
  FROM MyTable
 WHERE Column1 = 1
       OR Column2 = 1;