2017-05-08 8 views
0

nehme ich eine Tabelle empgroupinfo, und ich will die Employeeid holen, die diese zwei groupId genau kommen in 500 and 501 nur (dynamisch kommen) sollte mehr oder weniger Anzahl der Gruppe nicht kommen, wo empid != 102 Das ist in 500 Groupid.Postgresql: Abfrage Rückkehr falsche Daten

Ich habe folgende Abfrage versucht:

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

Aber die obige Abfrage gibt auch die EmpID, die in anderen Gruppen sind.

Ich möchte die empid für den Fall abholen, wenn Mitarbeiter nur in genau diesen zwei Groupids (500 und 501) und empid != 102 sind.

Antwort

1

Ihre WHERE Klausel Zeilen auswählt, wo empgroupid entweder 500 oder 501 ist, nicht empid s, wo alle empgroupid s [500, 501] das Array bilden.

Sie könnten eine ARRAY_AGG in der HAVING-Klausel verwenden:

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] 

Je nachdem, wo das [500, 501] Array kommt, können Sie nicht wissen, ob es sich sortiert ist oder nicht. In diesem Fall sollte auch ein "contains AND is contained by" (Operatoren @> und <@) funktionieren.


#= 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: Ich fürchte, ich verstehe Ihre Bearbeitung nicht. Wenn Sie nicht 'empId = 102' wollen, fügen Sie einfach einen 'WHERE empId <> 102' zu Ihrer Anfrage hinzu. – Marth

+0

Entschuldigung, ich habe einen Fehler gemacht, es ging nicht um Empid! = 102 Danke, ich korrigierte Danke, es funktionierte für mich .. –

+0

Erzähl mir eine Sache Angenommen, wenn meine Groupids sind 400 und 345 so werde ich mein Array in Asc Reihenfolge Array für nach frage? –

0

Versuchen:

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

empgroupid ist dynamisch –

+0

Es gibt nur zwei mögliche Werte für empgroupid? Sind sie immer zusammenhängend? Könnten Sie mehr Beispiele geben? – Renzo

+0

wird es zufällig sein –