2017-03-21 58 views
0

我需要修改以下代碼以搜索其中一個存活爲空而另一個不存在的組。目前,該查詢返回兩個都存在的組。我正在尋找所有在一個記錄A中的存活與另一個記錄B中的一個id不匹配的所有組,但僅在記錄B中的存活爲空的情況下。如何根據Oracle中的一個組中的2個不同標準比較2個不同的記錄?

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 
); 

這是返回差異,兩個倖存者都填充。我錯過了什麼?

編輯:

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

返回

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

原因: 組1具有ID 1個匹配到第二個記錄的監測網;因此我們不希望它返回。

組2,id 3有一個與另一個記錄的ID不匹配的存活。與此同時,第二個存儲區域爲空。這是我們需要返回的。

第3組都有一個非空的存活。這些都不需要。

編輯2:我終於想出了這個查詢:

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

你能編輯你的問題,並提供樣本數據和所需的結果? –

+0

@Gordon Linoff原文已更新。 – user7002207

回答

0

添加and t2.surv is null到您的查詢。

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

我認爲我們需要'和(t2.surv爲空或t1.surv爲空)而不是(t2.surv爲空且t2.surv爲空)' – saikumarm

0

如果你只是想在,也許是一個聚集會做:

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 

其實,即使你所需要的原始行,你可以用解析函數做到這一點:

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

這仍然返回所有組,其中t1.id = t2。監測網。我試圖讓我們的團體t1.id <> t2.surv。 – user7002207

相關問題