4

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

这是我的声明:

    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

它适用于我的测试系统,所以我“确定”可用数据记录中一定有错误,但我不知道如何找到那些..

4

3 回答 3

6

试试这个查询:

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

这应该为您提供重复行的 sap_sid

于 2012-04-24T10:23:10.417 回答
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
于 2012-04-24T10:05:59.890 回答
1

我会调查你跑步时得到的结果:

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

但是您可以强制只返回一行(我认为这是一种软糖,并且不建议使用它至少添加一个 order by 以对返回的行进行一些控制),例如:

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

(未测试只是用谷歌搜索了如何限制 oracle 中的结果)

如果您解决了数据问题(根据 ABCades 评论),那么我建议您根据 weenoid 的回答将其转换为使用连接。这也将突出未来可能出现的其他数据问题。

简而言之:我从来没有以这种方式修复过任何东西。真正的答案是调查返回的多行并决定你想要做什么:

  1. 添加更多 where 子句
  2. 排序结果,只选择第一行
  3. 实际上保留重复项,因为它们代表了您以前没有想到的场景
于 2012-04-24T10:13:14.840 回答