Подзапрос вернул более 1 значения - PullRequest
2 голосов
/ 24 августа 2011

Мне нужно выбрать отдельные контакты с 1 статусом.

Проблема заключается в том, что один контакт может иметь несколько одновременных статусов на основе 4 отдельных столбцов.

Активный статус заменяет неактивный.Если контакт имеет активное и неактивное состояние одновременно, он по умолчанию должен быть активным.

Пока мои подзапросы работают хорошо независимо, но возвращают более 1 значения, когда один контакт имеет 2 или более одновременных статусав разных столбцах.

Есть идеи, как вернуть один контакт с 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 ]

6 голосов
/ 24 августа 2011

Рассматривали ли вы вместо этого CASE ?

SELECT
    Contact,
    MyStatus = CASE 
        WHEN Column1 = 1 OR Column2 = 1 THEN 'Active'
        WHEN Column3 = 1 OR Column4 = 1 THEN 'Inactive'
    END
FROM
    MyTable 
4 голосов
/ 24 августа 2011

Не совсем уверен в вашем вопросе, но вы ищете одну строку состояния, зависящую от четырех столбцов;

    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 голосов
/ 24 августа 2011

Я думаю, что вам нужен оператор case вместо подзапросов.

select Contact,
       case when Column1 = 1 or Column2 = 1 then 'Active'
            when Column3 = 1 or Column4 = 1 then 'Inactive'
       end as MyStatus     
from MyTable
1 голос
/ 24 августа 2011

Я не запускал его, но это, по крайней мере, анализирует и должно указать вам правильное направление:

select contact, 
case when column1 = 1 or column2 = 1 then 'Active'
     when column3 = 1 or column4 = 1 then 'Inactive'
end
    as 'MyStatus'
from mytable
0 голосов
/ 25 августа 2011

Я думаю, ты почти у цели.Вам по существу не хватает реляционного оператора 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;
0 голосов
/ 24 августа 2011

Вы можете использовать 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
0 голосов
/ 24 августа 2011

Я не до конца понимаю ваш вопрос, и я не думаю, что подзапросы - это способ решить эту проблему, но вы можете попробовать это:

SELECT Contact,
       (SELECT TOP 1 ActiveStatus FROM SomeTable WHERE This = 1 AND That = 2 ORDER BY ActiveStatus ASC)
FROM SomeTable
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...