-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 个显式连接。这是我第一次使用这种查询,但它可以编译。但是,此查询中的左连接不起作用。也就是说,如果我在 TDTL 中没有与 THDR 上的记录相对应的记录,则查询不会返回任何行。

你能帮我修一下吗?

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)

当 , 中没有匹配的条目时TDTLTDTL.TXN_SOURCE_CDNULL被拒绝,记录将被拒​​绝。

您需要重新考虑涉及SOURCE.

于 2013-03-04T10:52:33.187 回答
1

您可以在语句中使用以下子句,

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

如果您还想检查空值。看看这是否有效

于 2013-03-04T11:00:50.807 回答
1

这很难理解,但切换到使用一致的连接语法会有所帮助。提供数据和预期结果会有所帮助,因此这在很大程度上是一种猜测。但问题似乎出在:

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

由于这在 and 之间强制执行内连接条件,因此SOURCEand之间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)可以为空,那么该比较将不起作用,但根本不清楚您想要发生什么。你可以这样做:

  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 回答