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

ただし、次のようなものを使用して、1つの行のみを強制的に返すことができます(これはファッジであると考えており、少なくとも、返される行をある程度制御するために注文を追加することはお勧めしません)。

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

(オラクルで結果を制限する方法をグーグルでテストしただけではありません)

(ABCadesのコメントに従って)データの問題を修正する場合は、weenoidの回答に従って結合を使用するように変換することをお勧めします。これにより、将来発生する可能性のある他のデータの問題も浮き彫りになります。

短い:私はこの方法で何も修正したことがありません..本当の答えは、返された複数の行を調査し、おそらく何をしたいかを決定することです:

  1. where句をさらに追加する
  2. 結果を並べ替えて、一番上の行のみを選択します
  3. 複製は、これまで考えたことのないシナリオを表しているため、実際に保持してください。
于 2012-04-24T10:13:14.840 に答える