子查询返回的值超过1

时间:2011-08-24 15:57:09

标签: sql tsql

我需要选择具有1种状态的个人联系人。

问题是单个联系人可以基于4个不同的列来同时拥有多个状态。

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

到目前为止,我的子查询可以独立工作,但当单个联系人在不同列中有两个或更多同时状态时,它们会返回超过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 

7 个答案:

答案 0 :(得分:6)

您是否考虑过使用CASE

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

答案 1 :(得分:4)

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

    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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

我没有运行它,但这至少解析并且应该指向正确的方向:

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

答案 4 :(得分:0)

你可以使用CASE - 这应该有效,因为它会按顺序评估条件..

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

答案 5 :(得分:0)

我想你差不多了。您基本上缺少的是EXCEPT关系运算符,例如

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;

答案 6 :(得分:-1)

我不完全理解你的问题,我不认为子查询是这样的,但你可以试试这个:

SELECT Contact,
       (SELECT TOP 1 ActiveStatus FROM SomeTable WHERE This = 1 AND That = 2 ORDER BY ActiveStatus ASC)
FROM SomeTable
...