gpt4 book ai didi

sql - Oracle 返回的左连接表达式和行数

转载 作者:行者123 更新时间:2023-12-04 20:40:35 25 4
gpt4 key购买 nike

尽管左表中的 where 子句应该找到单个记录,但使用左连接的查询不会返回记录。在这种情况下,它应该返回一个记录,其中包含左表中包含值的字段和右表中的空字段,因为它们之间没有匹配。

显然,在连接表达式上引用正确表的 case 的使用存在问题。

在 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 的任何限制。到目前为止,我们认为这是一个错误。

使用的数据:
  • A:Id=1,描述=项目A1;
  • B:Id=1,描述=项目B1;
  • C:Id=1,Id_B=2,标志=S。
  • 最佳答案

    CREATE TABLE t1 AS (SELECT 1 ID FROM dual);
    CREATE TABLE t2 AS (SELECT 2 ID FROM dual);
    CREATE TABLE t3 AS (SELECT 2 id_b, 's' flag FROM dual);

    SELECT t1.*
    FROM t1 LEFT JOIN t2
    ON t1.ID = t2.ID
    AND 1 = CASE WHEN t2.id = t2.id and (SELECT flag FROM t3 WHERE t3.id_b = t2.ID) = 's' THEN 1 ELSE 0 END
    where t1.id = 1;

    输出: no rows selected
    结果看起来很奇怪,我想这可能是一个错误。

    Oracle 文档仅说明
    https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries006.htm#SQLRF52337

    You cannot compare a column with a subquery in the WHERE clause of any outer join, regardless which form you specify.



    通过查看上述查询的计划,我可以看到这种情况:
     AND 1 = CASE WHEN t2.id = t2.id and (SELECT flag FROM t3 WHERE t3.id_b = t2.ID) = 's' THEN 1 ELSE 0 END

    解释为:
     CASE WHEN (T2.ID(+)=T2.ID(+) AND (SELECT FLAG FROM T3 T3 WHERE T3.ID_B=:B1)='s') THEN 1 ELSE 0 END =1

    并且是 加入后计算 .

    我想 Oracle 在执行连接之前无法计算 CASE(因为 T2.ID(+)=T2.ID(+) )

    关于sql - Oracle 返回的左连接表达式和行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067912/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com