【问题标题】:Adding a left join reduces the number of rows returned添加左连接会减少返回的行数
【发布时间】:2014-10-01 08:10:33
【问题描述】:

我正在尝试调试以下一段 SQL,其中的最后一段是左连接。当我运行下面的查询时,我得到 8 行,但如果我删除最后一个左连接,我会得到 13 个结果。我的理解是左连接不应该减少返回的行数,这怎么可能?

SELECT  *
  FROM
(
  SELECT   A.QUESTIONNAIRE_ID,
      D.QUESTION_ANSWER_ID   ,
      D.QUESTION_REPLICA_ID
    FROM ADMINISTRATIONS A,
      ADMINISTRATION_DETAILS D
    WHERE A.ADMINISTRATION_ID = 4326509
      AND A.ADMINISTRATION_ID =D.ADMINISTRATION_ID
)
T
  JOIN QUESTION_ANSWERS QA
  ON QA.QUESTION_ANSWER_ID=T.QUESTION_ANSWER_ID
  JOIN QUESTIONS Q
  ON Q.QUESTION_ID=QA.QUESTION_ID
  JOIN ANSWERS A
  ON A.ANSWER_ID=QA.ANSWER_ID
  JOIN PHRASES PA
  ON PA.PHRASE_ID=A.PHRASE_ID
  JOIN QUESTIONNAIRE_DETAILS QD
  ON QD.QUESTIONNAIRE_ID      = T.QUESTIONNAIRE_ID
    AND QD.QUESTION_ID        =QA.QUESTION_ID
    AND QD.QUESTION_REPLICA_ID=1
  LEFT JOIN QUESTIONNAIRE_DETAILS D
  ON D.QUESTIONNAIRE_ID      = T.QUESTIONNAIRE_ID
    AND D.QUESTION_ID        =QA.QUESTION_ID
    AND D.QUESTION_REPLICA_ID=T.QUESTION_REPLICA_ID
  LEFT JOIN ANSWER_VALUES AV
  ON AV.QUESTIONNAIRE_ID=T.QUESTIONNAIRE_ID
    AND AV.QUESTION_ID  =QA.QUESTION_ID
    AND AV.ANSWER_ID    =QA.ANSWER_ID
  LEFT JOIN ADMINISTRATION_DETAILS AD
  ON AD.ADMINISTRATION_ID     =4326509
    AND AD.QUESTION_ANSWER_ID =T.QUESTION_ANSWER_ID
    AND AD.QUESTION_REPLICA_ID=T.QUESTION_REPLICA_ID
  LEFT JOIN ADMINISTRATION_OPEN_ANSWERS O
  ON O.ADMINISTRATION_ID     =AD.ADMINISTRATION_ID
    AND O.QUESTION_ANSWER_ID =AD.QUESTION_ANSWER_ID
    AND O.QUESTION_REPLICA_ID=AD.QUESTION_REPLICA_ID
  LEFT JOIN --the offending left join that causes me to get 8 results instead of 13
    (
      SELECT 1 AS destination_id FROM dual
    )
    RD
  ON RD.DESTINATION_ID       = 0
    AND O.QUESTION_ANSWER_ID = 1328 --If I remove just this line, I get 13 results
    ;

似乎正在发生的事情是强制检查表 O 中没有条目的行被删除,但我找不到任何文档解释这是预期的行为。

我正在运行 Oracle Database 12c 版本 12.1.0.1.0 - 64 位生产

【问题讨论】:

  • 您是删除一行还是删除整个left join
  • 如果你 SELECT 0 AS destination_id FROM dual 而不是 1 会发生什么?
  • @GordonLinoff 执行任一操作都会返回正确的行数,即使左连接甚至不匹配我数据中的任何行

标签: sql oracle outer-join oracle12c


【解决方案1】:

看起来这是优化器中的一个错误,如果我用

回滚它
ALTER SESSION SET optimizer_features_enable='11.2.0.4';

它开始正常运行。

编辑:这是一个更永久的解决方案:

CREATE OR REPLACE TRIGGER revert_optimizer AFTER LOGON ON DATABASE
  DECLARE
    CMD VARCHAR2(100) := 'alter session set optimizer_features_enable="11.2.0.4"';
  BEGIN
    EXECUTE IMMEDIATE CMD;
  END revert_optimizer;

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多