Запрос на поиск кортежа с другими соответствующими элементами значения x - PullRequest
0 голосов
/ 13 марта 2011

Если у нас есть следующая таблица, называемая данными:
(id, n1, n2, n3, n4)<br> 111, 2, 4, 7, 0<br> 444, 1, 1, 2, 1<br> 555, 1, 1, 2, 0<br> 777, 5, 3, 8, 0

Как получить только (2,4,7) и (5,3,8)?

SELECT DISTINCT n1,n2,n3  
FROM data  
WHERE n4 = 0;  

не работает, так как возвращает также (1,1,2) кортеж.Мне нужны только кортежи с n4 = 0.

Ответы [ 5 ]

2 голосов
/ 13 марта 2011

Один из вариантов - использовать ИСКЛЮЧИТЬ :

SELECT n1, n2, n3
FROM data
WHERE n4 = 0

EXCEPT

SELECT n1, n2, n3
FROM data
WHERE n4 <> 0
1 голос
/ 13 марта 2011
SELECT
    d.n1, d.n2, d.n3
FROM
    data d
WHERE
    d.n4 = 0
    AND
    NOT EXISTS (SELECT *
      FROM
          data d2
      WHERE
          d.id = d2.id
          AND
          --3 columns = 3 pairs. n1-n2, n1-n3, n2-n3
          (d.n1 = d2.n2 OR d.n1 = d2.n3 OR d.n1 = d2.n3))

Edit:

Если 1,1,2 отличается от 1,2,1, то

SELECT
    MIN(id), n1, n2, n3
FROM
    data
WHERE
    n4 = 0
GROUP BY
    n1, n2, n3
HAVING
    COUNT(*) = 1
0 голосов
/ 15 марта 2011

Кажется довольно простым:

SELECT n1,
       n2,
       n3
FROM   data
GROUP  BY n1,
          n2,
          n3
HAVING Max(n4)=0 AND MIN(n4)=0;

Это будет выбираться только на основе кортежа n1, n2, n3 и где все значения n4 для групп кортежей равны 0

0 голосов
/ 14 марта 2011

обкатки:

create table data(id integer, n1 integer, n2 integer, n3 integer, n4 integer);

insert into data(id, n1, n2, n3, n4)
values (111, 2, 4, 7, 0), (444, 1, 1, 2, 1), 
       (555, 1, 1, 2, 0), (777, 5, 3, 8, 0);

при условии, что n4 не может быть нулевым или отрицательным:

select n1, n2, n3 from data group by n1, n2, n3 having max(n4)=0;

 n1 | n2 | n3
----+----+----
  2 |  4 |  7
  5 |  3 |  8
(2 rows)

, если вы не можете предположить, что:

insert into data(id, n1, n2, n3, n4)
values (881, 1, 1, 1, -1), (882, 1, 1, 1, null), (883, 1, 1, 1, 0);

select n1, n2, n3
from data
group by n1, n2, n3
having sum(case when n4=0 then 0 else 1 end)=0;

 n1 | n2 | n3
----+----+----
  2 |  4 |  7
  5 |  3 |  8
(2 rows)
0 голосов
/ 13 марта 2011

Вы можете использовать JOIN для себя:

SELECT d.n1, d.n2, d.n3
FROM data d
LEFT JOIN data d2 ON (d.n1 = d2.n1 AND d.n2 = d2.n2 AND d.n3 = d3.n3 AND d.n4 != d2.n4)
WHERE n4 = 0 AND d2.id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...