2016-03-04 198 views
-1

這是我的兩個表刪除冗餘數據

1)Salary_Details

SAL_NO         NOT NULL NUMBER 
EMP_NO         NOT NULL VARCHAR2(10) 
PAY_MONTH         NOT NULL DATE 
RECORD_DATE        NOT NULL DATE 
CURRENT_BSAL        NOT NULL NUMBER(10,2) 
SAL_INCREMENT        NOT NULL NUMBER(10,2) 
FINAL_BSAL        NOT NULL NUMBER(10,2) 
DESCRIPTION          VARCHAR2(1000) 

2)Pay_Details

PAY_NO         NOT NULL NUMBER 
EMP_NO         NOT NULL VARCHAR2(10) 
EMP_ERN_DDCT_NO       NOT NULL VARCHAR2(20) 
ERN_DDCT_CATNO       NOT NULL VARCHAR2(10) 
ERN_DDCT_CATNAME       NOT NULL VARCHAR2(1000) 
PAY_MONTH         NOT NULL DATE 
AMOUNT         NOT NULL NUMBER(10,2) 
EARN_DEDUCT        NOT NULL CHAR(1) 

這是我的Oracle查詢

select s.FINAL_BSAL, 
     s.EMP_No, 
     p.ERN_DDCT_CATNO, 
     p.AMOUNT 
from salary_details s, 
     pay_details p 
where s.emp_no=p.emp_no 
and s.SAL_NO IN (SELECT MAX(SAL_NO) 
        FROM SALARY_DETAILS 
        group by EMP_NO) 

,這裏是結果(幾行顯示ou共有41個行的噸)

enter image description here

在這裏,我需要刪除複製數據爲Final_BSal和EMP_NO。 我可以在EMP_NO或FINAL_BSAL上創建一個組嗎?如果是這樣如何?

+3

顯示您想要的輸出。 –

+0

第1-7行應該合併爲一行。你希望在ern_ddct_catno中的值和金額有什麼變化? –

+0

當然1-8行應該組合。可以顯示ern_ddct_catno並在該組合行下的金額?不知道是否可能 –

回答

1

試試下面的查詢

選擇s.EMP_NO, s.FINAL_BSAL, LISTAGG(p.ERN_DDCT_CATNO, '')在組(ORDER BY p.ERN_DDCT_CATNO)ERN_DDCT_CATNO, LISTAGG(p.AMOUNT, '')在組(ORDER BY p.AMOUNT)從salary_details的S量 ,pay_details p 其中s.emp_no = p.emp_no 和s.SAL_NO IN(SELECT MAX(SAL_NO)FROM sALARY_DETAILS組由EMP_NO) 組by EMP_NO,FINAL_BSAL order by s.EMP_No

+0

querry中的錯誤 –

+0

錯誤是什麼?再次嘗試。檢查提供的字段信息是否正確,因爲在結構中看不到任何名爲FINAL_BSAL和sal_no的字段。 –

+0

您需要編輯輸出以及與您的查詢輸出不匹配。因爲您的表中沒有FINAL_BSAL列,但在輸出中顯示。 –

1

您n eed一個相關的子查詢,而不是一個與GROUP BY。另外,學習使用恰當的明確的JOIN語法。規則很簡單:決不使用逗號FROM子句中:

select s.FINAL_BSAL, s.EMP_No, p.ERN_DDCT_CATNO, p.AMOUNT 
from salary_details s join 
    pay_details p 
    on s.emp_no = p.emp_no 
where s.SAL_NO = (SELECT MAX(SAL_NO) 
        FROM SALARY_DETAILS s2 
        WHERE s2.EMP_NO = s.EMP_NO 
       ); 

編寫查詢更簡單的方法是使用row_number()rank(),但上面的是你的方法只是一個簡單的修改。

+0

非常有用的做法。謝謝。 但是你的查詢仍然給出與mine.Any輸出相同的輸出一次顯示Final_Sal和Emp_No,其餘的相應? –

1

「在這裏,我需要刪除的Final_BSal和EMP_NO複製的數據」

沒有重複的數據。結果集中的每一行都是不同的。簡單地說,對於SALARY_DETAILS中的每一行,您在PAY_DETAILS中有多行。因此,有兩種選擇:

  1. 這是所需的結果,在這種情況下完成了工作。
  2. 這不是理想的結果。如果是這樣,您需要額外的業務規則,PAY_DETAILS上的過濾器來確定要返回哪一行。

例如,這除了WHERE子句將只返回前一個月PAY_DETAILS記錄:

and p.PAY_MONTH = trunc(add_months(sysdate, -1), 'MM') 

(假設PAY_MONTH保持爲當月的第一天)。

只有您(或您的用戶)無法解釋哪個解釋是正確的,以及您可能需要應用哪些其他業務規則。