2016-03-04 149 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保持为当月的第一天)。

只有您(或您的用户)无法解释哪个解释是正确的,以及您可能需要应用哪些其他业务规则。