左連接查詢不返回記錄,儘管左表的where子句應該找到單個記錄。在這種情況下,它應該返回一個記錄,其中包含值的左表中的字段和右表中的字段爲null,因爲它們之間沒有匹配。左連接表達式和Oracle返回的行數量
顯然,使用引用連接表達式上的右表的案例存在問題。
在SQL Server中,相同的查詢按預期工作。
select
t1.Description, t2.Description
from
A t1
left join
B t2
on
t1.Id = t2.Id and
1 = case when (
t2.Id = t2.Id and
(select t3.Flag from C t3 where t3.ID_B = t2.Id) = 'S'
) then 1 else 0
end
where t1.Id = 1
結果:沒有行返回。
然後,我將表達式t2.Id = t2.Id
(這裏僅僅是爲了演示問題,並且應該總是返回true,顯然)移出case表達式。
select
t1.Description, t2.Description
from
A t1
left join
B t2
on
t1.Id = t2.Id and
t2.Id = t2.Id and
1 = case when (
(select t3.Flag from C t3 where t3.ID_B = t2.Id) = 'S') then 1 else 0
end
where t1.Id = 1
結果:返回一行。
以上查詢僅用於演示問題,在實際情況下無用而且未優化。
我想知道是否有人知道Oracle與本案有關的任何限制。到目前爲止,我們認爲這是一個錯誤。
使用的數據:
- 答:ID = 1,描述=項目A1;
- B:Id = 1,Description = Item B1;
- C:Id = 1,Id_B = 2,Flag = S。
我不會說它是一個錯誤,我想叫它不同的實現。 SQL Server和ORACLE不是克隆。坦率地說,如果您覺得有必要在聯接中添加任何類型的case語句,我個人會更關心我自己的數據庫設計。 – HLGEM 2014-11-21 18:33:37
爲了仔細檢查我對問題的理解,您預期第一個查詢將返回一行? – 2014-11-21 21:14:53
這裏是測試表和查詢這個問題的任何人的問題查詢。運行查詢,然後查看執行計劃。 http://sqlfiddle.com/#!4/449ba/4 – 2014-11-21 21:25:01