2017-05-08 7 views
0

間違ったデータを返すクエリは、私は、テーブルempgroupinfoを持っていると私は正確にこの2のgroupId 500 and 501(動的に来る)だけで、より多くの来るまたはグループの数が少なくてはならない、empid != 102を来る社員を取得したいとしますこれは500グループIDです。Postgresqlの:

私は、クエリ、次の試してみました:

select empid from empgroupinfo 
where empgroupid in(500,501) and empid != 102 
group by empid having count(empid) = 2 

しかし、これ以上のクエリは、他のグループにあるEMPIDを返します。

従業員がこれらの2つのグループID(500と501)のみの場合とempid != 102の場合のempidを取得したいとします。

答えて

1

あなたWHERE句はempgroupidが500または501のいずれかである行、すべてのempgroupid sが配列[500, 501]を形成していないempid秒を選択します。

あなたはHAVING句でARRAY_AGGを使用することができます。

SELECT empid 
FROM empgroupinfo 
GROUP BY empid 
-- ORDER BY clause here is important, as array equality checks elements position by position, not just 'same elements as' 
HAVING ARRAY_AGG(DISTINCT empgroupid ORDER BY empgroupid) = ARRAY[500, 501] 

[500, 501]配列がどこから来るかに応じて、それ自体がソートされているかどうかを知ることができません。その場合、「ANDが含まれています」(オペレータ@>および<@)も機能するはずです。


#= CREATE TABLE empgroupinfo (empid int, empgroupid int); 
CREATE TABLE 
Time: 10,765 ms 

#= INSERT INTO empgroupinfo VALUES (1, 500), (1, 501), (2, 500), (2, 501), (2, 502); 
INSERT 0 5 
Time: 1,451 ms 

#= SELECT empid 
    FROM empgroupinfo 
    GROUP BY empid 
    HAVING ARRAY_AGG(empgroupid ORDER BY empgroupid) = ARRAY[500, 501]; 
┌───────┐ 
│ empid │ 
├───────┤ 
│  1 │ 
└───────┘ 
(1 row) 

Time: 0,468 ms 
+0

@BunkerBoy:私はあなたの編集を理解していないのですか? 'empId = 102'が必要でない場合は、' WHERE empId <> 102'をクエリに追加してください。 – Marth

+0

申し訳ありません私はempidについて間違いを犯しました!= 102今はおかげで修正されました。それは私のために働いてくれました.. –

+0

私のgroupidが400と345ならば、私は配列をascオーダークエリによると? –

0

試してみてください。

select empid 
from empgroupinfo 
group by empid 
where empid <> 102 
having count(*) = 2 and min(empgroupid) = 500 and max(empgroupid) = 501 
+0

empgroupidは動的で –

+0

empgroupidのための唯一の2つの値がありますか?それらは常に連続していますか?もっと例を挙げていただけますか? – Renzo

+0

それはランダムになるでしょう –