2017-02-22 3 views
0

Ich führe eine Abfrage und ich bekomme eine Ergebnismenge, wo ich 2 fast identische Zeilen habe, wo nur eine Spalte Wert ist - 'EXPLICIT_PERM'.fast identische Rowset verwerfen

Die Abfrage selbst ist ziemlich lang, und ich kann sie hier nicht posten, aber ich kann sagen, dass der Wert von 'EXPLICIT_PERM' in der Abfrage als Ergebnis des Wertes einer anderen Spalte bestimmt wird, seine Struktur ist etwa so:

SELECT * FROM ((QUERY1)UNION ALL (QUERY2) UNION ALL (QUERY3)); 

Die Abfrage gibt viele Ergebnisse zurück, aber in seltenen Fällen kann dieses doppelte Szenario auftreten.

QUERY RESULTS

Gibt es eine Möglichkeit kann ich überprüfen, ob ich zwei identische SERVER_IDs erhalten und verwerfen das Ergebnis der ‚0‘ als EXPLICIT_PERM enthält?

+1

Wie wäre es einfach mit wo in der äußeren Seite, ich meine aus der Union alle Klammer? –

+0

Ich muss die Zeile mit EXPLICIT_PERM = 0 verwerfen, nur für den Fall, dass eine Server-ID doppelt erscheint, wie kann ich das erkennen? –

+0

Warum wollen Sie das mit PL/SQL (einer Programmiersprache) lösen und nicht mit SQL? –

Antwort

2

Wenn ich gut verstehe, kann dies ein Weg sein. Angenommen, Sie bereits haben Sie r Anfrage ein Ergebnis geben, können Sie es auf diese Art und Weise wickeln:

with yourResult(server_id, server_name, explicit_perm, rank, total) as (
    select 93, 'AVIZNER', 1, 1, 10 from dual union all 
    select 93, 'AVIZNER', 0, 6, 10 from dual union all 
    select 11, 'XXXXXXX', 1, 1, 10 from dual union all 
    select 22, 'YYYYYYY', 0, 1, 10 from dual union all 
    select 11, 'ZZZZZZZ', 1, 1, 11 from dual union all 
    select 11, 'ZZZZZZZ', 1, 2, 22 from dual union all 
    select 11, 'ZZZZZZZ', 0, 1, 10 from dual 
) 
select server_id, server_name, explicit_perm, rank, total 
from (
     select server_id, server_name, explicit_perm, rank, total, 
       count (case when explicit_perm = 1 then 1 end) over (partition by server_id) as count_perm_1 
     from yourResult 
    ) 
where not (explicit_perm = 0 and count_perm_1 > 0)  

Dies zählt die Anzahl der Zeilen mit explicit_perm = 1 für jeden server_id und schließt dann die Zeilen, für die explicit_perm = 0 und wenigstens eine Reihe mit explicit_perm = 1 existiert für das gleiche server_id.

Das Ergebnis mit meinen Beispieldaten:

SERVER_ID SERVER_ EXPLICIT_PERM  RANK  TOTAL 
---------- ------- ------------- ---------- ---------- 
     11 ZZZZZZZ    1   2   22 
     11 ZZZZZZZ    1   1   11 
     11 XXXXXXX    1   1   10 
     22 YYYYYYY    0   1   10 
     93 AVIZNER    1   1   10 
+0

Funktioniert perfekt, danke. –

+0

Ich habe gerade festgestellt, dass nach dem Hinzufügen dieser zu meiner Abfrage, die ORDER BY ich durchführen wurde durcheinander gebracht. Ich sortiere nicht nach der Spalte 'server_id', aber wenn ich diesen Teil aus der Abfrage entferne, wird die Reihenfolge wieder normalisiert. Irgendeine Idee warum? –

+1

Sie können sich in der externen Abfrage nicht auf eine Bestellung ohne ORDER BY verlassen. Wenn Sie einige Kriterien bestellen müssen, besteht die einzige sichere Methode darin, der Abfrage eine ORDER BY-Klausel hinzuzufügen, die die erste Abfrage umschließt. – Aleksej

1

Der typische Ansatz besteht darin, Ihre Ergebniszeilen zu ranken (in Ihrem Fall per SERVER_ID) und nur den besten Platz zu behalten. Sie tun dies mit ROW_NUMBER.

select * 
from 
(
    select 
    row_number() over (partition by server_id order by explicit_term desc) as rn, 
    q.* 
    from (<your query>) q 
) 
where rn = 1; 
0

zusätzlich zu allen anderen interessanten Lösungen. Wir können auch versuchen, Gruppe by Klausel

Verwandte Themen