我有三个表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中。
答案 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 |
+----+------------------+-----+
答案 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>