-1

質問があります:

SELECT THDR.FILENAME,
       SOURCE.TXN_SOURCE_CD AS TXN_SOURCE_CD,
       SOURCE.DESCR as TXN_SOURCE,
       THDR.TXN_HEADER_ID,
       THDR.TXN_HEADER_EXT_ID,
       THDR.TXN_HEADER_DTTM,
       THDR.UPLOAD_DTTM,
       L.DESCR,
       NVL(SUM(TDTL.TXN_VOL), 0) TOTAL_VOLUME
  FROM ci_lookup_val_l L,
       ci_txn_source_l source,
       CI_TXN_HEADER   THDR
  LEFT JOIN ci_txn_detail TDTL 
  ON THDR.TXN_HEADER_ID = TDTL.TXN_HEADER_ID        

 WHERE TRIM(SOURCE.TXN_SOURCE_CD) = TRIM(TDTL.TXN_SOURCE_CD)
   AND SOURCE.LANGUAGE_CD = 'ENG'      
   AND L.FIELD_NAME = 'TXN_HEADER_STATUS'
   AND THDR.BO_STATUS_CD = L.FIELD_VALUE
   AND L.LANGUAGE_CD = 'ENG'
   AND THDR.TXN_HEADER_ID='22222228'
 GROUP BY THDR.FILENAME,SOURCE.DESCR,THDR.TXN_HEADER_ID,THDR.TXN_HEADER_EXT_ID,THDR.TXN_HEADER_DTTM,THDR.UPLOAD_DTTM,L.DESCR,SOURCE.TXN_SOURCE_CD

ご覧のとおり、このクエリには複数の暗黙的な結合と1つの明示的な結合があります。この種のクエリを使用したのはこれが初めてですが、コンパイルされます。ただし、このクエリの左結合は機能しません。つまり、THDRのレコードに対応するTDTLのレコードがない場合、クエリは行を返しません。

修正を手伝ってもらえますか?

4

5 に答える 5

2

私の提案は、すべてのクエリに明示的な結合を使用するようにクエリを変更することです。

SELECT THDR.FILENAME,
       SOURCE.TXN_SOURCE_CD AS TXN_SOURCE_CD,
       SOURCE.DESCR as TXN_SOURCE,
       THDR.TXN_HEADER_ID,
       THDR.TXN_HEADER_EXT_ID,
       THDR.TXN_HEADER_DTTM,
       THDR.UPLOAD_DTTM,
       L.DESCR,
       NVL(SUM(TDTL.TXN_VOL), 0) TOTAL_VOLUME
FROM ci_lookup_val_l L
INNER JOIN CI_TXN_HEADER   THDR
  ON THDR.BO_STATUS_CD = L.FIELD_VALUE
LEFT JOIN ci_txn_detail TDTL 
  ON THDR.TXN_HEADER_ID = TDTL.TXN_HEADER_ID       
LEFT JOIN ci_txn_source_l source
  on TRIM(SOURCE.TXN_SOURCE_CD) = TRIM(TDTL.TXN_SOURCE_CD)
  AND SOURCE.LANGUAGE_CD = 'ENG' 
WHERE L.FIELD_NAME = 'TXN_HEADER_STATUS' 
   AND L.LANGUAGE_CD = 'ENG'
   AND THDR.TXN_HEADER_ID='22222228'
GROUP BY THDR.FILENAME,
  SOURCE.DESCR,
  THDR.TXN_HEADER_ID,
  THDR.TXN_HEADER_EXT_ID,
  THDR.TXN_HEADER_DTTM,
  THDR.UPLOAD_DTTM,
  L.DESCR,
  SOURCE.TXN_SOURCE_CD
于 2013-03-04T11:23:52.340 に答える
1

問題はこの状態です:

 WHERE TRIM(SOURCE.TXN_SOURCE_CD) = TRIM(TDTL.TXN_SOURCE_CD)

に一致するエントリがない場合はTDTL、にTDTL.TXN_SOURCE_CDなりNULL、レコードは拒否されます。

を含む(暗黙の内部)結合を再考する必要がありますSOURCE

于 2013-03-04T10:52:33.187 に答える
1

ステートメントで次の句を使用できます。

WHERE TRIM(NVL(SOURCE.TXN_SOURCE_CD, 'NULL')) = TRIM(NVL(TDTL.TXN_SOURCE_CD, 'NULL'))

null値もチェックしたい場合。これが機能するかどうかを確認します

于 2013-03-04T11:00:50.807 に答える
1

従うのはかなり難しいですが、一貫した結合構文を使用するように切り替えると少しは役に立ちます。データと期待される結果を提供すると役立つため、これは主に推測です。しかし、問題は次のようです。

WHERE TRIM(SOURCE.TXN_SOURCE_CD) = TRIM(TDTL.TXN_SOURCE_CD)

これは と の間の内部結合条件を強制しているため、 とSOURCEの間のTDTL左の外部結合も効果的に内部結合になっています。それを外部結合にも移動する必要があります。THDRTDTL

このようなものは、あなたが望むものを与えるべきであるように見えますが、それでも実際には推測以上のものではありません:

SELECT THDR.FILENAME,
       SOURCE.TXN_SOURCE_CD AS TXN_SOURCE_CD,
       SOURCE.DESCR as TXN_SOURCE,
       THDR.TXN_HEADER_ID,
       THDR.TXN_HEADER_EXT_ID,
       THDR.TXN_HEADER_DTTM,
       THDR.UPLOAD_DTTM,
       L.DESCR,
       NVL(SUM(TDTL.TXN_VOL), 0) TOTAL_VOLUME
  FROM ci_lookup_val_l L
  JOIN ci_txn_source_l SOURCE
    ON SOURCE.LANGUAGE_CD = L.LANGUAGE_CD
  JOIN CI_TXN_HEADER THDR
    ON THDR.BO_STATUS_CD = L.FIELD_VALUE
  LEFT JOIN ci_txn_detail TDTL 
    ON TDTL.TXN_HEADER_ID = THDR.TXN_HEADER_ID        
   AND TRIM(TDTL.TXN_SOURCE_CD) = TRIM(SOURCE.TXN_SOURCE_CD)
 WHERE L.FIELD_NAME = 'TXN_HEADER_STATUS'
   AND L.LANGUAGE_CD = 'ENG'
   AND THDR.TXN_HEADER_ID = '22222228'
 GROUP BY THDR.FILENAME,SOURCE.DESCR,THDR.TXN_HEADER_ID,THDR.TXN_HEADER_EXT_ID,
           THDR.TXN_HEADER_DTTM,THDR.UPLOAD_DTTM,L.DESCR,SOURCE.TXN_SOURCE_CD;

しかし、TRIM(TDTL.TXN_SOURCE_CD)orTRIM(SOURCE.TXN_SOURCE_CD)が null になる可能性がある場合、その比較は機能しませんが、何をしたいのかはまったく明確ではありません。あなたがすることができます:

  LEFT JOIN ci_txn_detail TDTL 
    ON TDTL.TXN_HEADER_ID = THDR.TXN_HEADER_ID        
   AND ((TRIM(TDTL.TXN_SOURCE_CD) IS NULL AND TRIM(SOURCE.TXN_SOURCE_CD) IS NULL)
       OR (TRIM(TDTL.TXN_SOURCE_CD) = TRIM(SOURCE.TXN_SOURCE_CD)))

...しかし、それがあなたが期待する答えを与えるかどうかは本当にわかりません(それが何であれ!)。

于 2013-03-04T12:11:25.017 に答える
0

質問に答えてくれたすべての人に感謝します。実際の解決策を見つけるために、ほとんどの回答で行われた提案を組み合わせました。

SELECT THDR.FILENAME,
       SOURCE.TXN_SOURCE_CD AS TXN_SOURCE_CD,
       SOURCE.DESCR as TXN_SOURCE,
       THDR.TXN_HEADER_ID,
       THDR.TXN_HEADER_EXT_ID,
       THDR.TXN_HEADER_DTTM,
       THDR.UPLOAD_DTTM,
       L.DESCR,
       NVL(SUM(TDTL.TXN_VOL), 0) TOTAL_VOLUME
  FROM ci_lookup_val_l L,
       CI_TXN_HEADER   THDR
  LEFT JOIN ci_txn_detail TDTL 
  ON THDR.TXN_HEADER_ID = TDTL.TXN_HEADER_ID        
  LEFT JOIN ci_txn_source_l source
  ON (TRIM(NVL(SOURCE.TXN_SOURCE_CD, 'NULL')) = TRIM(NVL(TDTL.TXN_SOURCE_CD, 'NULL')) AND SOURCE.LANGUAGE_CD = :LANGUAGE)

 WHERE L.FIELD_NAME = 'TXN_HEADER_STATUS'
   AND THDR.BO_STATUS_CD = L.FIELD_VALUE
   AND L.LANGUAGE_CD = :LANGUAGE

 GROUP BY THDR.FILENAME,SOURCE.DESCR,THDR.TXN_HEADER_ID,THDR.TXN_HEADER_EXT_ID,THDR.TXN_HEADER_DTTM,THDR.UPLOAD_DTTM,L.DESCR,SOURCE.TXN_SOURCE_CD;
于 2013-03-04T11:38:14.113 に答える