【发布时间】:2015-07-17 10:13:56
【问题描述】:
我正在处理的表格(为了在此处显示)如下所示:
一个
A_ID | Clob_Col
1 | value
2 | value
3 | null
4 | value
5 | null
6 | value
7 | value
8 | null
9 | value
10 | value
乙
B_ID |A_ID | C_ID
10 | 1 | 20
11 | 2 | 20
12 | 6 | 21
13 | 7 | 22
14 | 8 | 22
15 | 9 | 23
C
C_ID
20
21
22
23
24
25
(所有表都有更多列)
我希望编写一个查询,该查询将返回所有三个表中的值,但排除某些值与表 C 中的值匹配的记录(不包含)。 我的问题是在表 C 上使用 NOT IN 子句时返回表 A 中 不 链接到表 B 的值。
例子:
SELECT a.A_ID, a.Clob_Col, b.B_ID, c.C_ID
from A a
LEFT JOIN B b on a.A_ID=b.A_ID
LEFT JOIN C c on b.C_ID=c.C_ID
WHERE a.AID >= 2
AND a.AID <= 7
AND c.C_ID NOT IN (22, 23, 24)
最后一行 - c.C_ID NOT IN (22, 23, 24) - 将在 B 表中留下以下记录:b_BID = 10,11 或 12
反过来,这些链接到表 A 中的以下记录:a.ID = 1,2 和 6。
第一个子句 - a.AID >= 2 AND a.AID <= 7 - 进一步将我们的最终结果限制为 a.ID = 2 和 6。
最终结果将如下所示:
A_ID |Clob_Col |B_ID |C_ID
2 |value |11 |20
6 |value |12 |21
但是我还想返回未链接到表 B 的 A 表记录 - a.ID 3、4 和 5 所以我希望我的结果是
A_ID |Clob_Col |B_ID |C_ID
2 |value |11 |20
3 |null |null |null
4 |value |null |null
5 |null |null |null
6 |value |12 |21
注意:我包含 Clob 值的原因是有人建议选择所有记录,然后对 c.C_ID IN (22, 23, 24) 所在的记录执行 MINUS 操作。
这似乎是合理的,但是 Oracle 不允许涉及 Clob 列的 MINUS 操作。
【问题讨论】:
-
只是一瞥,但您不需要在 JOIN 之后添加一些 ON 子句吗?
-
这些数据的小提琴将是最有用的
-
关于加入 c 表 - 如果 b 表中 a_id = 6 的 c_id 值不是 c_id 表中的值,您希望最终输出显示什么? a_id = 6 行是否显示? (简而言之,我问的是 c 表应该是内连接还是外连接到 b 表,如果是外连接,是否要将空值计为不在 (22,23,24) 中)
-
感谢大家注意到缺少的 ON s。这是一个疏漏,已被纠正。但它并没有解决这个问题。
标签: sql oracle oracle-sqldeveloper