【发布时间】: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