2017-05-22 25 views
0

這是Oracle數據庫的SQL(PL/SQL)SQL刪除重複記錄沒有明顯

我有一個三列數據表(爲便於討論)。 我需要刪除返回的行,其中columnA和columnB與表中的另一個記錄匹配,並且columnC等於'james'。但是,如果columnC等於'james'和columnA,則columnB不匹配結果集中的任何其他行。請保留它。然後

ColumnA ColumnB ColumnC 
_______________________ 
45  blue John <-Keep 
45  blue James <-Remove 
32  Red  John <-Keep 
32  Red  James <-Remove 
12  Yellow James <-Keep 

的結果集將是:

ColumnA ColumnB ColumnC 
_______________________ 
45  blue John 
32  Red  John 
12  Yellow James 

顯然,真實的數據更復雜,有更多的列。我的背景是在公式的C#端,而不是Oracle DB端。我嘗試了一些臨時表格,但因爲我需要說「我多返回一行,其中一個是詹姆斯記錄」,所以我無法接近任何工作。謝謝您的幫助。

+2

什麼如果有多行有45,藍色和其他名字? – GurV

+0

@GurwinderSingh在這個例子中,我只想刪除James記錄。 – Dan

回答

4

下面是一個使用窗函數來獲得的匹配記錄計數的一種方法:

SELECT 
    columnA, 
    columnB, 
    columnC 
FROM 
    (
     SELECT 
      columnA, 
      columnB, 
      columnC, 
      COUNT(*) OVER (PARTITION BY columnA, columnB) as rcount 
     FROM table 
    ) sub 
WHERE 
    (sub.rcount = 2 AND columnC = 'John') 
    OR sub.rcount = 1; 
+0

這個答案太具體。它不會在稍微更多的數據上工作。 – GurV

+0

我能夠實現這個演示,但在這個層(DB與視圖)做的其他問題讓我轉向不同的解決方案(即這只是我們不想重新測試的一個大過程的一小部分)。但是這是爲我的工具箱添加了另一個工具。謝謝 – Dan

+0

@GurwinderSingh這個答案是針對這個問題的。 OP最大的收穫是,通過分區獲取COUNT(*)將允許他們通過該分區發現重複記錄。他們希望在發現之後過濾他們。例如,也許'WHERE sub.rcount> 1 AND columnC <>'James''。 – JNevill

2

您可以檢查是否有用於columnA和columnB的給定組合非「詹姆斯」記錄使用分析count功能與case

with your_table (ColumnA ,ColumnB ,ColumnC) as (
    select 45, 'blue' ,'ABC' from dual union all 
    select 45, 'blue' ,'Jimmy' from dual union all 
    select 45, 'blue' ,'John' from dual union all 
    select 45, 'blue' ,'James' from dual union all 
    select 32, 'Red'  ,'John' from dual union all 
    select 32, 'Red'  ,'James' from dual union all 
    select 12, 'Yellow' ,'James' from dual 
    ) 
--Sample data ends. Solution starts below-- 


select ColumnA ,ColumnB ,ColumnC 
from (
    select t.*, 
     case when count(case when columnC <> 'James' then 1 end) over (
        partition by columnA, 
        columnB 
        ) > 0 then 1 else 0 end as flag 
    from your_table t 
    ) 
where flag = 0 
    or columnC <> 'James' 

輸出:

COLUMNA COLUMNB COLUMNC 
12  Yellow James 
32  Red  John 
45  blue John 
45  blue Jimmy 
45  blue ABC