2017-02-15 2 views
3

Brauchen Sie Hilfe auf, was die Sql sein wird, wenn ich Kontakte finden möchte, die nur einzelne Regel 2 hat. Daher sollte die Ausgabe Kontakt ID 1 und 7. Ich suche nicht für den Kontakt Id 5 & 6 in der Ausgabe als sie mehr als eine ruleid obwohl sie 2Oracle sql, um einzelne Zeile von Duplikaten zu finden

Contactid ruleid 
1     2 
5     3 
5     2 
6     4 
6     2 
7     2 

auf diese Kann jemand bitte helfen ruleid bekommen haben.

SELECT Contactid FROM <YOURTABLE> 
WHERE ruleid = 2 
AND Contactid NOT IN 
    (SELECT Contactid FROM <YOURTABLE> 
    WHERE ruleid <> 2) 
+0

Ist es möglich, doppelte Zeilen zu haben (dh die gleiche 'contactid' ** und ** die gleiche' rulesid' zur gleichen Zeit)? Wenn Sie zum Beispiel zwei Zeilen mit 'contactid = 8' und' ruleid = 2' haben (und keine anderen Zeilen für diese 'contactid'), was sollte das Ergebnis sein? AUCH: Kann 'contactid' oder' ruleid' '' NULL'' sein? – mathguy

+0

Danke für Ihre Antwort. Wir können keine doppelten Zeilen haben, in denen Kontakt-ID 8 und Regel-2 wiederholt werden. In beiden Spalten sind auch keine Nullen zulässig. – sam2539431

Antwort

2

Sie könnten so etwas wie dies versuchen.

select contactid 
from  table_name 
group by contactid 
having min(ruleid) = 2 
    and max(ruleid) = 2 
+2

'not in' funktioniert möglicherweise nicht wie vorgesehen, wenn' contactid' 'NULL' sein kann. Außerdem sollte die richtige Antwort (die eine Variation der Aggregat- oder GROUP BY-Abfrage wäre) die Basistabelle nur einmal und nicht zweimal lesen. – mathguy

+0

@mathguy das ist richtig, Gruppierung wäre effizienter als die Verwendung einer Unterabfrage. – nbouchet

0

So etwas wie dies funktionieren sollte und wird effizient:

+0

Interessant - Ich sehe einen Downvote. Würde der Downvoter darauf achten, mit der Community zu teilen, was sie bei dieser Abfrage falsch fanden? Zum Wohle aller? Vielen Dank! – mathguy

+0

Hallo, deine Frage hat Wunder für mich bewirkt. Es hat mit Perfektion funktioniert. Vielen Dank. – sam2539431

1
WITH your_table_name as(
     SELECT 1 AS Contactid , 2 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 5 AS Contactid , 3 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 5 AS Contactid , 2 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 6 AS Contactid , 4 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 6 AS Contactid , 2 AS ruleid FROM DUAL 
     UNION ALL 
     SELECT 7 AS Contactid , 2 AS ruleid FROM DUAL 
) 

SELECT t.* FROM (
     SELECT Contactid FROM your_table_name 
     WHERE ruleid = 2 
     GROUP BY Contactid 
     HAVING COUNT(*) = 1 
    ) t 
    left JOIN (
     SELECT Contactid FROM your_table_name 
     WHERE ruleid <> 2 
     GROUP BY Contactid 
    ) tt 
    ON 
    t.Contactid = tt.Contactid 
    where tt.Contactid is null 
+0

Hallo ich habe das versucht und auch eine Bedingung für ruleid = 2 hinzugefügt, aber das hat nicht funktioniert. – sam2539431

+0

Meine Abfrage wurde ausgewählt contactid aus der Tabelle, wo rulesid = 2 group von ruleid mit count (ruleid) = 1 – sam2539431

+0

@ sam2539431 - Sie müssen nicht etwas hinzufügen. Ich habe meine Antwort mit CTE aktualisiert, bitte sehen Sie es. –

0

Dies ist nicht genug für Sie?

select contactid from table group by contactid having count(ruleid)=1 
+0

Dies setzt voraus, dass jede "contactid" ** eine Zeile mit "ruleid = 2" hat. Dies gilt für die bereitgestellten Beispieldaten, wird jedoch in der Problembeschreibung nicht als Garantie angegeben. (Es kann aber immer noch wahr sein!) – mathguy

+0

Hallo, Danke für Ihre Antwort. Es ist möglich, dass ein Kontakt keine Regelid 2 – sam2539431

+0

??? Wo überprüfe ich nach ruleid = 2 ?????? –

Verwandte Themen