2017-03-21 3 views
0

Ich muss den folgenden Code ändern, um nach Gruppen zu suchen, in denen eine Surv-Datei null ist und die andere nicht. Derzeit gibt die Abfrage Gruppen zurück, in denen beide Surv Daten enthalten sind. Ich suche alle Gruppen, in denen der Surv für einen Datensatz A nicht mit einer ID im anderen Datensatz B übereinstimmt, sondern nur in Fällen, in denen der Surv in Datensatz B null ist.Wie kann ich 2 verschiedene Datensätze basierend auf 2 verschiedenen Kriterien innerhalb einer Gruppe in Oracle vergleichen?

SELECT * 
FROM MY_TABLE t3 
WHERE t3.GROUP_id IN (
SELECT t1.GROUP_id 
FROM MY_TABLE t1, MY_TABLE t2 
WHERE t1.id <> t2.id 
AND t1.GROUP_id = t2.GROUP_id 
AND t1.id <> t2.surv 
AND t2.id <> t1.surv 
); 

Dies ist die Rückkehr Unterschiede, wo beide Survlays sind ausgefüllt. Was vermisse ich?

edit:

--------------------------------- 
| group | id | surv  | 
---------------------------------- 
| 1  | 1  | null  | 
| 1| | 2  | 1   | 
| 2  | 3  | 107  | 
| 2  | 4  | null  | 
| 3  | 5  | 89   | 
| 3  | 6  | 89   | 
---------------------------------- 

Rückkehr

--------------------------------- 
| group | id | surv  | 
---------------------------------- 
| 2  | 3  | 107  | 
| 2  | 4  | null  | 
---------------------------------- 

Grund: Gruppe 1 hat id 1 Treffer zu surv des zweiten Datensatzes; als solche wollen wir es nicht zurückgeben.

Gruppe 2, ID 3 hat einen Surv, der nicht mit der ID des anderen Datensatzes übereinstimmt. Zusammen damit ist das zweite Überlebensfeld null. Dies ist, was wir brauchen, zurückgekehrt.

Gruppe 3, beide haben ein Überleben von nicht null. Diese werden nicht benötigt.

bearbeiten 2: Ich kam schließlich mit dieser Abfrage nach oben:

SELECT cluster_id, oidmu, survoid 
FROM MY_TABLE t3 
WHERE t3.GROUP_id IN (
    SELECT t1.GROUP_id 
    FROM MY_TABLE t1, MY_TABLE t2 
    WHERE t1.ID <> t2.ID 
    AND t1.GROUP_id = t2.GROUP_id 
    AND (t1.ID <> t2.SURV and t1.SURV is null) 
); 
+0

Können Sie Ihre Frage bearbeiten und Beispieldaten und gewünschte Ergebnisse bereitstellen? –

+0

@Gordon Linoff Das Original wurde aktualisiert. – user7002207

Antwort

0

hinzufügen and t2.surv is null auf Ihre Anfrage.

SELECT * 
FROM MY_TABLE t3 
WHERE t3.GROUP_id IN (
SELECT t1.GROUP_id 
FROM MY_TABLE t1, MY_TABLE t2 
WHERE t1.id <> t2.id 
AND t1.GROUP_id = t2.GROUP_id 
AND t1.id <> t2.surv 
AND t2.id <> t1.surv 
and t2.surv is null 
); 
+0

Ich denke, wir brauchen 'und (t2.surv ist null oder t1.surv ist null) und nicht (t2.surv ist null und t2.surv ist null)' – saikumarm

0

Wenn Sie nur die Gruppen wollen, vielleicht eine Aggregation tun:

SELECT t.GROUP_ID 
FROM MY_TABLE t 
GROUP BY GROUP_ID 
HAVING COUNT(surv) > 0 AND  -- at least one is not null 
     COUNT(surv) < COUNT(*); -- at least one is null 

Eigentlich, auch wenn Sie die ursprünglichen Reihen tun müssen, können Sie dies mit analytischen Funktionen tun könnte:

SELECT t.GROUP_ID 
FROM (SELECT t.*, COUNT(*) OVER (PARTITION BY GROUP_ID) as cnt, 
      COUNT(surv) OVER (PARTITION BY GROUP_ID) as cnt_surv 
     FROM MY_TABLE t 
    ) t 
WHERE cnt_surv > 0 and cnt_surv < cnt 
+0

Dies gibt immer noch alle Gruppen, in denen t1.id = t2. überleben Ich versuche Gruppen zu bekommen, weh t1.id <> t2.surv. – user7002207

Verwandte Themen