为什么查询无法在oracle中按预期方式工作?它返回0行,尽管它应该返回2行

时间:2018-06-19 18:13:01

标签: oracle

我有三个表A,B和C。表B和C中的id1列是表A列ID的外键。

请查看下面的结构

表A:

id value
1  1
2  2
3  3

表B:

id value            id1
1  2018-04-21-00001   1
2  2018-04-21-00003   1
3  2018-04-21-00009   1
4  2018-04-21-00007   1
5  2018-04-21-00008   1

表C:

id2 value2           id1
1  2018-04-21-00001   1
2                     1
3  2018-04-21-00002   1
4                     1
5  2018-04-21-00004   1
6                     1
7  2018-04-21-00006   2

查询:

select * from B b, C c  
where c.id1 = b.id1 and c.id1 = 1 and 
c.value2 is not null and c.value2 <> b.value 

我假设它应该返回2行,但是不能按预期工作。它返回空行。您能帮我解决查询问题吗?查询在oracle中。

2 个答案:

答案 0 :(得分:1)

在初始加入条件id1下,您将获得5*6级别的笛卡尔乘积。对于您的样本数据将是30+----+------------------+-----+----+------------------+-----+ | id | value | id1 | id | value2 | id1 | +----+------------------+-----+----+------------------+-----+ | 1 | 2018-04-21-00001 | 1 | 1 | 2018-04-21-00001 | 1 | | 1 | 2018-04-21-00001 | 1 | 2 | (null) | 1 | | 1 | 2018-04-21-00001 | 1 | 3 | 2018-04-21-00002 | 1 | | 1 | 2018-04-21-00001 | 1 | 4 | (null) | 1 | | 1 | 2018-04-21-00001 | 1 | 5 | 2018-04-21-00004 | 1 | | 1 | 2018-04-21-00001 | 1 | 6 | (null) | 1 | | 2 | 2018-04-21-00003 | 1 | 1 | 2018-04-21-00001 | 1 | | 2 | 2018-04-21-00003 | 1 | 2 | (null) | 1 | | 2 | 2018-04-21-00003 | 1 | 3 | 2018-04-21-00002 | 1 | | 2 | 2018-04-21-00003 | 1 | 4 | (null) | 1 | | 2 | 2018-04-21-00003 | 1 | 5 | 2018-04-21-00004 | 1 | | 2 | 2018-04-21-00003 | 1 | 6 | (null) | 1 | | 3 | 2018-04-21-00009 | 1 | 1 | 2018-04-21-00001 | 1 | | 3 | 2018-04-21-00009 | 1 | 2 | (null) | 1 | | 3 | 2018-04-21-00009 | 1 | 3 | 2018-04-21-00002 | 1 | | 3 | 2018-04-21-00009 | 1 | 4 | (null) | 1 | | 3 | 2018-04-21-00009 | 1 | 5 | 2018-04-21-00004 | 1 | | 3 | 2018-04-21-00009 | 1 | 6 | (null) | 1 | | 4 | 2018-04-21-00007 | 1 | 1 | 2018-04-21-00001 | 1 | | 4 | 2018-04-21-00007 | 1 | 2 | (null) | 1 | | 4 | 2018-04-21-00007 | 1 | 3 | 2018-04-21-00002 | 1 | | 4 | 2018-04-21-00007 | 1 | 4 | (null) | 1 | | 4 | 2018-04-21-00007 | 1 | 5 | 2018-04-21-00004 | 1 | | 4 | 2018-04-21-00007 | 1 | 6 | (null) | 1 | | 5 | 2018-04-21-00008 | 1 | 1 | 2018-04-21-00001 | 1 | | 5 | 2018-04-21-00008 | 1 | 2 | (null) | 1 | | 5 | 2018-04-21-00008 | 1 | 3 | 2018-04-21-00002 | 1 | | 5 | 2018-04-21-00008 | 1 | 4 | (null) | 1 | | 5 | 2018-04-21-00008 | 1 | 5 | 2018-04-21-00004 | 1 | | 5 | 2018-04-21-00008 | 1 | 6 | (null) | 1 | +----+------------------+-----+----+------------------+-----+ 结果记录。

c.value2 is not null

http://sqlfiddle.com/#!15/b7798/1

在该结果集中,您说+----+------------------+-----+----+------------------+-----+ | id | value | id1 | id | value2 | id1 | +----+------------------+-----+----+------------------+-----+ | 1 | 2018-04-21-00001 | 1 | 1 | 2018-04-21-00001 | 1 | | 2 | 2018-04-21-00003 | 1 | 1 | 2018-04-21-00001 | 1 | | 3 | 2018-04-21-00009 | 1 | 1 | 2018-04-21-00001 | 1 | | 4 | 2018-04-21-00007 | 1 | 1 | 2018-04-21-00001 | 1 | | 5 | 2018-04-21-00008 | 1 | 1 | 2018-04-21-00001 | 1 | | 1 | 2018-04-21-00001 | 1 | 3 | 2018-04-21-00002 | 1 | | 2 | 2018-04-21-00003 | 1 | 3 | 2018-04-21-00002 | 1 | | 3 | 2018-04-21-00009 | 1 | 3 | 2018-04-21-00002 | 1 | | 4 | 2018-04-21-00007 | 1 | 3 | 2018-04-21-00002 | 1 | | 5 | 2018-04-21-00008 | 1 | 3 | 2018-04-21-00002 | 1 | | 1 | 2018-04-21-00001 | 1 | 5 | 2018-04-21-00004 | 1 | | 2 | 2018-04-21-00003 | 1 | 5 | 2018-04-21-00004 | 1 | | 3 | 2018-04-21-00009 | 1 | 5 | 2018-04-21-00004 | 1 | | 4 | 2018-04-21-00007 | 1 | 5 | 2018-04-21-00004 | 1 | | 5 | 2018-04-21-00008 | 1 | 5 | 2018-04-21-00004 | 1 | +----+------------------+-----+----+------------------+-----+ 将其减少到15条记录。

c.value2 <> b.value

http://sqlfiddle.com/#!15/b7798/2

然后,您说2018-04-21-00001,这将为您留下14条记录,因为只有+----+------------------+-----+----+------------------+-----+ | id | value | id1 | id | value2 | id1 | +----+------------------+-----+----+------------------+-----+ | 2 | 2018-04-21-00003 | 1 | 1 | 2018-04-21-00001 | 1 | | 3 | 2018-04-21-00009 | 1 | 1 | 2018-04-21-00001 | 1 | | 4 | 2018-04-21-00007 | 1 | 1 | 2018-04-21-00001 | 1 | | 5 | 2018-04-21-00008 | 1 | 1 | 2018-04-21-00001 | 1 | | 1 | 2018-04-21-00001 | 1 | 3 | 2018-04-21-00002 | 1 | | 2 | 2018-04-21-00003 | 1 | 3 | 2018-04-21-00002 | 1 | | 3 | 2018-04-21-00009 | 1 | 3 | 2018-04-21-00002 | 1 | | 4 | 2018-04-21-00007 | 1 | 3 | 2018-04-21-00002 | 1 | | 5 | 2018-04-21-00008 | 1 | 3 | 2018-04-21-00002 | 1 | | 1 | 2018-04-21-00001 | 1 | 5 | 2018-04-21-00004 | 1 | | 2 | 2018-04-21-00003 | 1 | 5 | 2018-04-21-00004 | 1 | | 3 | 2018-04-21-00009 | 1 | 5 | 2018-04-21-00004 | 1 | | 4 | 2018-04-21-00007 | 1 | 5 | 2018-04-21-00004 | 1 | | 5 | 2018-04-21-00008 | 1 | 5 | 2018-04-21-00004 | 1 | +----+------------------+-----+----+------------------+-----+ 被删除的记录。

WHERE

http://sqlfiddle.com/#!15/b7798/3

如果您像我在这里那样一步一步构建c,这会更加明显。 相反,您只想要b的{​​{1}}中不在id1 = 1中的记录。所以:

SELECT *
FROM C c
WHERE c.id1 = 1
  AND c.Value2 IS NOT NULL
  AND c.Value2 NOT IN (SELECT Value FROM B WHERE B.id1 = c.id1);


+----+------------------+-----+
| id |      value2      | id1 |
+----+------------------+-----+
|  3 | 2018-04-21-00002 |   1 |
|  5 | 2018-04-21-00004 |   1 |
+----+------------------+-----+

http://sqlfiddle.com/#!15/b7798/6

答案 1 :(得分:0)

表A的用途是什么?

正确连接,查询不会返回2个所需行:

SQL> with b (id, value, id1) as
  2    (select 1, '00001', 1 from dual union all
  3     select 2, '00003', 1 from dual union all
  4     select 3, '00009', 1 from dual union all
  5     select 4, '00007', 1 from dual union all
  6     select 5, '00008', 1 from dual
  7    ),
  8  c (id2, value2, id1) as
  9    (select 1, '00001', 1 from dual union all
 10     select 2, null   , 1 from dual union all 
 11     select 3, '00002', 1 from dual union all
 12     select 4, null   , 1 from dual union all 
 13     select 5, '00004', 1 from dual union all
 14     select 6, null   , 1 from dual union all 
 15     select 7, '00006', 2 from dual           
 16    )
 17  select *
 18  from b join c on b.id = c.id2
 19  where c.id1 = 1
 20    and c.value2 is not null
 21    and c.value2 <> b.value
 22  ;

        ID VALUE        ID1        ID2 VALUE        ID1
---------- ----- ---------- ---------- ----- ----------
         3 00009          1          3 00002          1
         5 00008          1          5 00004          1

SQL>