Sql 删除冗余数据

Sql 删除冗余数据,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,这是我的两张桌子 1附件详细信息 SAL_NO NOT NULL NUMBER EMP_NO NOT NULL VARCHAR2(10) PAY_MONTH NOT NULL DATE RECORD_DATE NOT NULL DATE

这是我的两张桌子

1附件详细信息

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_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)
结果如下:在总共41行中,显示的行很少

在这里,我需要为Final_BSal和EMP_NO删除复制的数据。 我可以按EMP\u NO或FINAL\u BSAL分组吗?如果是这样,怎么做?

尝试下面的查询

选择s.EMP\U编号, s、 最后,, listagg p.ERN_DDCT_CATNO,,“在p.ERN_DDCT_CATNOERN_DDCT_CATNO的集团订单内, 按p.AMOUNTAMOUNT列出集团订单中的“p.AMOUNTAMOUNT” 从薪资明细s,薪资明细p 其中s.emp\u no=p.emp\u no 和s.SAL_NO,按EMP_NO从薪资详细信息组中选择MAXSAL_NO 按EMP编号分组,最终
order by s.EMP_No

您需要一个相关的子查询,而不是一个带有GROUP by的子查询。此外,还要学习使用正确的显式连接语法。简单规则:不要在FROM子句中使用逗号:

编写查询的一种更简单的方法是使用row_number或rank,但以上只是对方法的简单修改

在这里,我需要删除Final_BSal和EMP_NO的复制数据

没有重复的数据。结果集中的每一行都是不同的。简单地说,您在PAY\u DETAILS中有多行,而SALARY\u DETAILS中的每一行都有多行。因此,有两种选择:

这是期望的结果,在这种情况下,工作完成了。 这不是期望的结果。如果是这样,您需要一个额外的业务规则,即PAY_DETAILS上的过滤器,以确定返回哪一行。 例如,添加到WHERE条款后,只会返回上个月的PAY_详细信息记录:

and p.PAY_MONTH = trunc(add_months(sysdate, -1), 'MM')
假设每月工资为每月的第一个月


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

显示所需的输出。第1-7行应合并为一行。您希望ern_ddct_catno和amount中的值会发生什么变化?当然,应该合并第1-8行。我可以在合并的行下显示ern_ddct_catno和amount吗?我不知道这是否可能,错误是什么?请再试一次。检查提供的字段信息是否正确,因为在您的结构中看不到任何名为FINAL\u BSAL和sal\u no的字段。您需要编辑输出,并且输出与查询输出不匹配。因为表中没有FINAL\u BSAL列,但在输出中显示。@Jain。。请原谅我的这种疯狂。。更新我的表格首先,您使用同一表格中的EMP_NO和FINAL_BSAL两列,即工资详细信息,因此您不需要加入。选择s.EMP_NO,s.FINAL_BSAL from salary_details,其中SAL_NO在中选择MAXSAL_NO from salary_details group by EMP_NO group by s.EMP_NO,s.FINAL_BSAL order by s.EMP_Nob,但我需要显示相关的Ern_DDCT_CATNO和金额。这是我在上面更新的查询---选择s.FINAL\u BSAL、s.EMP\u No、p.ERN\u DDCT\u CATNO、p.AMOUNT from salary\u details s、pay\u details p,其中s.EMP\u No=p.EMP\u No和s.SAL\u No在EMP\u NOVery有用的实践中从salary\u details组中选择MAXSAL\u No。谢谢。但是您的查询仍然提供与我相同的输出。是否有任何方法可以显示Final_Sal和Emp_noone time以及其他相应的时间?
and p.PAY_MONTH = trunc(add_months(sysdate, -1), 'MM')