Возвращаемые записи SQL на основе значений нескольких столбцов - PullRequest
0 голосов
/ 24 августа 2018

Допустим, у меня есть следующие данные:

Number  TagValue
1       MLB
1       NFL
2       MLB
2       NFL
3       MLS
3       NFL
4       NFL

Я хочу вернуть следующее:

Number  TagValue
1       MLB
1       NFL
2       MLB
2       NFL

Запрос состоит в том, чтобы просмотреть каждую комбинацию значений числовых тегов и посмотреть, есть ли у них ОБА MLB и NFL. Если это не так, я не хочу его возвращать. Простое предложение where вернет:

Number  TagValue
1       MLB
1       NFL
2       MLB
2       NFL
3       NFL
4       NFL

Я не хочу этого.

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Вы можете использовать exists:

select t.*
from table t
where exists (select 1 from table t1 where t1.number = t.number and t1.tagvalue = 'MLB') and
      exists (select 1 from table t1 where t1.number = t.number and t1.tagvalue = 'NFL')
0 голосов
/ 24 августа 2018

Если вы хотите показать только записи, в которых число имеет оба тега, а фактический тег записи является одним из тегов, то прямое решение будет состоять из дизъюнкции в два раза равной операции и EXISTS .

SELECT t1.number,
       t1.tagvalue
       FROM elbat t1
            WHERE t1.tagvalue = 'MLB'
                  AND EXISTS (SELECT *
                                     FROM elbat t2
                                     WHERE t2.number = t1.number
                                           AND t2.tagvalue = 'NFL')
                   OR t1.tagvalue = 'NFL'
                      AND EXISTS (SELECT *
                                         FROM elbat t2
                                         WHERE t2.number = t1.number
                                               AND t2.tagvalue = 'MLB');
0 голосов
/ 24 августа 2018

Если вы хотите вернуть все числа, которые имеют оба кода, вы можете сделать:

select number
from t
where tagvalue in ('MLB', 'NFL')
group by number
having min(tagvalue) <> max(tagvalue);

В этом случае я вижу небольшую утилиту для возврата нескольких строк.

Если вам нужны числатолько с одной командой, тогда:

select number, max(tagvalue)
from t
where tagvalue in ('MLB', 'NFL')
group by number
having min(tagvalue) = max(tagvalue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...