单行子查询返回多行 - 如何查找副本?

时间:2012-04-24 09:59:55

标签: sql database oracle

我不是一个很大的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

它适用于我的测试系统,因此我“确定”可用数据记录中必定存在错误,但我不知道如何找到它们。

3 个答案:

答案 0 :(得分:6)

尝试使用此查询:

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

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

答案 1 :(得分: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

答案 2 :(得分: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

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

如果您修复了数据问题(根据A.B.Cades评论),那么我建议根据weenoid的答案将其转换为使用连接。这也将突出显示未来可能出现的其他数据问题。

简而言之:我从来没有用这种方式解决任何问题。真正的答案是调查返回的多行并决定你想做什么:

  1. 在where子句中添加更多内容
  2. 订购结果,只选择顶行
  3. 实际上保留了重复项,因为它们代表了您之前没有想到的场景