【问题标题】:Oracle inconsistent sql resultoracle sql结果不一致
【发布时间】:2019-01-15 09:41:02
【问题描述】:

我有三个完全相同的 sql 查询。但是,其中之一不返回任何结果。我找不到该问题的正确解释。

任何人都可以

--returns one result
   SELECT col1
   FROM table1
   WHERE col1  not IN
   (select x.hesno from (SELECT c1||c2||c3 FROM Table2 S) x) ; 

--returns no result
   SELECT col1
   FROM table1
   WHERE col1  not IN
     (SELECT c1||c2||c3 FROM table2)  ;


--returns one result
   SELECT col1
   FROM Table1
   WHERE NOT EXISTS (
     SELECT 1 FROM table2 WHERE c1||c2||c3 = col1
   );

这是表格说明

Table1
Name   Null? Type          
------ ----- ------------- 
COL1          VARCHAR2(15)  

Table2
Name            Null? Type          
--------------- ----- ------------- 
C1                    VARCHAR2(2)   
C2                    VARCHAR2(3)   
C3                    VARCHAR2(10)

【问题讨论】:

  • 如果子查询返回空值,NOT IN 不会返回任何行。
  • “我有三个完全相同的 sql 查询”——这显然不是真的;也许您的意思是它们(您相信)在逻辑上是相同的?但是,您的第一个甚至无效,因为内部子查询没有hesno 的别名。如果您从前两个中得到不同的结果,并且存在该别名,那么这会稍微有趣一些;第三个得到与前两个不同的结果可能不是(参见关于空值的评论/答案)。无论哪种方式,请显示示例数据以及使用该数据获得的实际查询和结果。

标签: sql oracle subquery


【解决方案1】:

如果子查询在NOT IN ( subquery ) 内返回空值,则查询不会返回行。

下面的 SQL 返回12345

With WTH0 AS (
  SELECT '12345' x FROM dual
),
WTH1 AS (
  SELECT '1' c1, '2' c2, '3' c3 FROM dual
)
SELECT X 
FROM WTH0
WHERE X NOT IN (SELECT C1||C2||C3 FROM WTH1);

With WTH0 AS (
  SELECT '12345' x FROM dual
),
WTH1 AS (
  SELECT '1' c1, '2' c2, '3' c3 FROM dual union
  SELECT null c1, null c2, null c3 FROM dual
)
SELECT X 
FROM WTH0
WHERE X NOT IN (SELECT C1||C2||C3 FROM WTH1);

返回空结果集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2018-11-15
    • 1970-01-01
    • 2014-09-21
    • 2013-03-12
    相关资源
    最近更新 更多