选择带有“is null”子句的查询和子选择/左连接不返回结果

Posted

技术标签:

【中文标题】选择带有“is null”子句的查询和子选择/左连接不返回结果【英文标题】:Select query with "is null"-clause and subselect / left join returns no results 【发布时间】:2019-05-05 15:06:43 【问题描述】:

我正在尝试在 Oracle 12c 的基础上从 DETAIL 表中选择条目,该表应满足两个 where 约束:

    外键在子选择中 列为空

以下带有子选择(in-clause)的语句根本不返回任何结果。

select *
  from DETAIL
  where (PARENT_ID) in (
    select ID from MASTER where COL1 = 1)
  and COL2 is null;

而且左连接也不返回任何结果:

select d.*
from MASTER m
left join DETAIL d
  on d.PARENT_ID = m.ID
where m.COL1 = 1
  and d.COL2 is null;

我的表格设置包含以下表格:

create table MASTER (
  ID NUMBER(19) NOT NULL,
  COL1 NUMBER(19),
  primary key (ID)
);
insert into MASTER ("ID", "COL1") VALUES (1, 1);
insert into MASTER ("ID", "COL1") VALUES (2, 2);
insert into MASTER ("ID", "COL1") VALUES (3, 1);

create table DETAIL (
  ID NUMBER(19) NOT NULL,
  PARENT_ID NUMBER(19),
  COL2 NUMBER(2,0),
  primary key (ID),
  foreign key (PARENT_ID) references MASTER(ID)
);
insert into DETAIL ("ID", "PARENT_ID", "COL2") VALUES (1, 1, 1);
insert into DETAIL ("ID", "PARENT_ID", "COL2") VALUES (2, 2, 1);
insert into DETAIL ("ID", "PARENT_ID", "COL2") VALUES (3, 3, 1);
insert into DETAIL ("ID", "PARENT_ID", "COL2") VALUES (4, 3, 2);

根据上面的代码,我希望得到超过 0 个条目。

有什么建议吗?谢谢!

【问题讨论】:

在您的示例中,所有具有 parent_id mathc 的行和匹配的行都没有 col2 和 NULL .. 这意味着您的 LEFT JOIN 返回完整的结果 “我希望”为什么?当您告诉我们原因时,这有助于我们向您解释您有错误的想法。 【参考方案1】:

在您的 DETAIL 表中,COL2 始终有一个值,因此永远不会为 NULL。因此,COL2 IS NULL 条件永远不会满足,您的查询不会返回任何结果。

【讨论】:

以上是关于选择带有“is null”子句的查询和子选择/左连接不返回结果的主要内容,如果未能解决你的问题,请参考以下文章

使用asp.net mv在ado.net中选择带有where子句的查询

带有连接和group by子句的选择查询中的MySQL性能问题

单表查询多表查询和子查询

EF4 将 is null 子句添加到 where 子句

从带有 HAVING 子句的 MySQL 视图中选择返回空结果集

不使用带有 order 子句和更大限制 MariaDB 的索引的简单 SQL 查询