2012-04-24 73 views
4

我不是一个大的ORACLE - SQL Expert,所以我希望有人知道一个很好的方法来找到“重复”记录至极导致:单行子查询返回多行错误。单行子查询返回多行 - 如何查找重复?

此我声明:

SELECT 
    CAST(af.SAP_SID AS VARCHAR2(4000)) APP_ID, 
    (SELECT DR_OPTION 
     FROM 
      DR_OPTIONS 
     WHERE DR_OPTIONS.ID = (
      select dr_option from applications where applications.sap_sid = af.sap_sid)) DR_OPTION 
FROM 
    APPLICATIONS_FILER_VIEW af 

它的作品在我的测试系统上,所以IAM“确保”,必须有可用的数据记录中的错误,但我不知道如何去寻找那些..

+0

执行内查询自己去看看他们返回的.. – gordatron 2012-04-24 10:05:21

+3

尝试与此查询:'选择applications.sap_sid,计数(dr_option)从应用程序组by application.sap_sid具有count(dr_option)> 1'这应该给你重复行的sap_sid – 2012-04-24 10:11:51

+3

@ ABCade的答案应该被复制到答案部分和恕我直言接受。这是这个问题的一般解决方案。 – Karl 2012-04-24 10:19:05

回答

6

与此查询尝试一个场景:

select applications.sap_sid, count(dr_option) 
from applications 
group by applications.sap_sid 
having count(dr_option) > 1 

这应该给你复制的行sap_sid

+0

嗡嗡声无法找到失败( - : – opHASnoNAME 2012-04-24 11:26:05

+0

@ArneRie,查询没有找到任何行? – 2012-04-24 12:11:42

+0

有一些行可以找到,但在测试系统上完整的查询正在工作( - :查询与“IN”我认为这不是正确的解决方案:-) – opHASnoNAME 2012-04-24 12:19:36

1

我建议简化您的查询:

SELECT  CAST(af.SAP_SID AS VARCHAR2(4000)) APP_ID, 
      dr.DR_OPTION 
FROM  APPLICATIONS_FILER_VIEW af 
INNER JOIN applications a ON af.sap_sid = a.sap_sid 
INNER JOIN DR_OPTIONS dr ON a.dr_option = dr.ID 
+0

谢谢,但它只是一个更长查询的“快照”( - : – opHASnoNAME 2012-04-24 10:09:37

+0

)运行上面的查询应该可以帮助您识别重复行 – weenoid 2012-04-24 10:12:40

1

我会调查你会得到什么,当你运行:

select dr_option from applications where applications.sap_sid = af.sap_sid 

但您可以强制只返回一行(我认为这是一个巧克力,并不建议使用它,至少通过对返回的行进行一些控制来添加一个订单),如下所示:

SELECT 
CAST(af.SAP_SID AS VARCHAR2(4000)) APP_ID, 
(SELECT DR_OPTION 
    FROM 
     DR_OPTIONS 
    WHERE DR_OPTIONS.ID = (
     select dr_option 
     from applications 
     where applications.sap_sid = af.sap_sid 
      and rownumber = 1) 
    ) DR_OPTION 
FROM 
    APPLICATIONS_FILER_VIEW af 

(未测试只是GOOGLE上搜索如何限制结果在Oracle)

如果解决数据问题(按ABCades评论),那么我会建议将其转换为使用加入按weenoid的答案。这也将突出显示未来可能出现的其他数据问题。

简而言之:我从来没有以这种方式固定的东西..真正的答案是,调查多行返回,并且决定要也许做什么:

  1. 增加更多的where子句
  2. 秩序结果,只选择最上面一行
  3. 实际上保留副本,因为它们代表了你有没有想到过
+2

事实上,他获得多个结果不会意思是他们都是一样的(否则他可以使用不同的)。你可以推荐的(尽管它可能不是他想要的)是使用'in'而不是'=' – 2012-04-24 10:21:16

+0

@ABCade抱歉,你的意思是'rownumber在1'或'DR_OPTIONS.ID IN(' – gordatron 2012-04-24 10:24:52

+1

'... WHERE DR_OPTIONS.ID IN(从application.sap_sid = af.sap_sid选择dr_option)'(删除'rownumber = 1') – 2012-04-24 10:26:58