2016-04-01 10 views
0

Betrachten Sie die folgende TabellePrüfen auf inkonsistente Werte innerhalb von Gruppen

document_id group_id level 
-------------------------------- 
1    1   1 
2    1   1 
3    2   3 
4    2   3 
5    2   2 
6    3   1 
7    4   6 
8    4   6 
9    4   6 
10    5   2 
11    5   1 

Ich möchte überprüfen, ob die level von Dokumenten innerhalb eines group_id konsistent ist, und wenn nicht, diese Gruppen angezeigt werden soll.

document_id group_id level 
-------------------------------- 
3    2   3 
4    2   3 
5    2   2 
10    5   2 
11    5   1 

Wie kann ich das erreichen: So für das obige Beispiel würde die Ausgabe sein? Jede Hilfe wäre willkommen.

Antwort

1

Verwenden EXISTS diese Zeilen zu finden, wo gleiche group_id inkonsistent Pegelwerte hat:

select document_id, group_id, level 
from tablename t1 
where exists (select 1 from tablename t2 
       where t2.group_id = t1.group_id 
       and t2.level <> t1.level) 

Und das ist, wie es ausführt:

SQL>create table t (document_id int, group_id int, level int); 
SQL>insert into t values(1, 1, 1); 
SQL>insert into t values(2, 1, 1); 
SQL>insert into t values(3, 2, 3); 
SQL>insert into t values(4, 2, 3); 
SQL>insert into t values(5, 2, 2); 
SQL>insert into t values(6, 3, 1); 
SQL>insert into t values(7, 4, 6); 
SQL>insert into t values(8, 4, 6); 
SQL>insert into t values(9, 4, 6); 
SQL>insert into t values(10, 5, 2); 
SQL>insert into t values(11, 5, 1); 
SQL>select document_id, group_id, level 
SQL&from t t1 
SQL&where exists (select 1 from t t2 
SQL&    where t2.group_id = t1.group_id 
SQL&    and t2.level <> t1.level); 
document_id group_id  level 
=========== =========== =========== 
      3   2   3 
      4   2   3 
      5   2   2 
     10   5   2 
     11   5   1 

        5 rows found 

gleiches Ergebnis wie in Frage angegeben.

+0

Dies gibt nur die abweichenden Zeilen zurück. Ich suchte nach der ganzen inkonsistenten Gruppe, die angezeigt werden sollte. Upvote, um mir zu helfen! – Pr0no

+1

@ Pr0no, ich bekomme Ihren Kommentar nicht. Meine Abfrage gibt das von Ihnen angegebene Ergebnis zurück. – jarlh

+0

Mein schlechtes. Ich habe in der OP vergessen ... viele Male, "level" wird "NULL" sein. Wenn es eine Gruppe mit Dokumenten gibt, die 'NULL' haben, sollten diese auch angezeigt werden. Zufällig gibt @Gordons Antwort dieses Ergebnis zurück. Einverstanden, es war nicht in der Spezifikation. Nahm die angenommene Antwort weg. Wie würde Ihre Lösung aussehen, um auch NULLs anzuzeigen? – Pr0no

1

Modified jarlh Antwort auf Abfrage-Ergebnis Spiel OPs gewünschten Ausgang zu machen:

Verwenden Sie exists, um diese Zeilen zu finden, wo gleiche Gruppe auch andere Ebenen hat:

select document_id, group_id, level 
from tablename t1 
where exists (select 1 from tablename t2 
       where t2.level <> t1.level 
       and t2.group_id = t1.group_id) 
+0

nicht beabsichtigt, zu entführen, aber die Bearbeitung suggestion wurde abgelehnt – user5226582

+0

dies nur die abweichenden Zeilen zurückgibt. Ich suchte nach der ganzen inkonsistenten Gruppe, die angezeigt werden sollte. Upvote, um mir zu helfen! – Pr0no

1

Als Alternative zu exists, können Sie Fensterfunktionen:

select document_id, group_id, level 
from (select t.*, min(level) over (partition by group_id) as minlevel, 
      max(level) over (partition by group_id) as maxlevel 
     from t 
    ) t 
where minlevel <> maxlevel; 
+0

diese Antwort als richtig markieren, da diese die vollständigen Gruppen zurückgibt, anstatt der abweichenden Zeilen :) – Pr0no

Verwandte Themen