2017-02-25 43 views
0

我有表的查找用戶,其非UID屬性相同

CREATE TABLE Permission (uid char(32), pid char(32), term char(32), 
PRIMARY KEY (uid, pid, term)) 

含有值,如

uid pid term 
0001 1001 3        
0001 1002 3        
0001 1002 4        
0002 1001 3        
0002 1002 3        
0002 1002 4        
0003 1001 3        
0003 1002 4        
0003 1002 5 

我要回誰具有相同的PID和長期價值的所有用戶的UID ,在這個例子中,我想要0001和0002,但我不知道如何比較每個uid的pid和term值與其他uid的pid和term值中的每一個。我能夠得到的最接近的是確定每個用戶是否有重複的pid。

SELECT uid 
FROM Permission 
GROUP BY uid, pid 
HAVING COUNT (*) > 1 

我甚至不確定是否與我想要執行的測試有關。和

SELECT uid 
FROM (SELECT P1.uid, P1.pid 
     FROM Permission P1 
     WHERE EXISTS (SELECT P2.pid 
        FROM Permission P2 
        WHERE P1.pid = P2.pid)) P 
GROUP BY P.uid 
HAVING COUNT (P.pid) = (SELECT COUNT (P3.pid) 
         FROM Permission P3 
         WHERE P3.uid = P.uid) 

我想這應該工作,但我顯然是錯誤的,因爲它只是返回所有的uid =)

回答

1

你可以做到這一點與自我加入和聚合:

with p as (
     select p.*, count(*) over (partition by uid) as cnt 
     from permissions p 
    ) 
select p1.uid, p2.uid 
from p p1 join 
    p p2 
    on p1.pid = p2.pid and 
     p1.term = p2.term and 
     p1.cnt = p2.cnt and 
     p1.uid < p2.uid 
group by p1.uid, p2.uid, p1.cnt 
having count(*) = p1.cnt; 
+0

它不是強制性的,這個解決方案確實它所需要的,但在那裏與這個返回例如同樣有超過2情況下,如果1,2和4的所有比賽(1,2)( 1,4)(2,4)。什麼是將所有這些組合成一個解決方案(1,2,4)的快捷方式,無論是元組,字符串還是其他? – Kebtiz

+0

你可能想問這是另一個問題。答案可能看起來很不一樣。 –

+0

好的,如果我需要追求它,那更多的是好奇心,而不是要求,我會接受你的建議,謝謝。 – Kebtiz

0

組由所有三貴列

SELECT uid, pid, term 
FROM PERMISSION 
GROUP BY uid, pid, term 
HAVING COUNT(*) > 1 

,您可以選擇從這如果你只需要一列

SELECT DISTINCT uid 
FROM (
    SELECT uid, pid, term 
    FROM PERMISSION 
    GROUP BY uid, pid, term 
    HAVING COUNT(*) > 1 
) t