2011-03-13 40 views
0

如果我們稱之爲數據如下表:
(id, n1, n2, n3, n4)
111, 2, 4, 7, 0
444, 1, 1, 2, 1
555, 1, 1, 2, 0
777, 5, 3, 8, 0
查詢與其他有價值的相應元素找到元組X

我們如何只(2,4,7)獲得和(5,3,8 )?

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

不起作用,因爲它也返回(1,1,2)元組。我只需要一直有n4 = 0的元組。

+0

總是4列? – gbn 2011-03-13 14:55:08

+0

並且1,1,2和1,2,1一樣嗎? – gbn 2011-03-13 15:25:38

回答

2

其中一個選項是使用EXCEPT

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

EXCEPT 

SELECT n1, n2, n3 
FROM data 
WHERE n4 <> 0 
+0

+1,非常優雅 – 2011-03-13 21:37:31

0

你可以使用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 
1
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)) 

編輯:

如果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

測試平臺:

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

似乎相當簡單:

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

這將僅基於n1,n2,n3元組進行選擇,並且元組的所有n4值都爲0

相關問題