Oracle SQL:在没有子查询联接的情况下从另一个表中排除ID

时间:2019-02-22 13:56:36

标签: sql oracle

我想知道在不两次连接同一张表的情况下是否可以进行以下操作:

Table A:
+----+------+
| ID | ColA |
+----+------+
|  1 | A1   |
|  2 | A2   |
|  3 | A3   |
|  4 | A4   |
+----+------+

Table B:
+----+------+
| ID | ColB |
+----+------+
|  1 | B1   |
|  2 | B2   |
|  3 | B3   |
|  4 | B4   |
|  5 | B5   |
|  6 | B6   |
+----+------+

Table C:
+----+
| ID | 
+----+
|  1 | 
|  2 | 
+----+

Desired result: (A LEFT JOIN B WITHOUT C)
+----+------+------+
| ID | ColA | ColB |
+----+------+------+
|  3 | A3   | B3   |
|  4 | A4   | B4   |
+----+------+------+

因此,基本上我需要将B列添加到表A,因此需要左连接,并排除表C中出现的所有ID。

当前解决方案:

SELECT a.id, a.ColA, b.ColB
  FROM tableA a
  LEFT JOIN tableB b ON a.id = b.id
  WHERE a.id NOT IN(
    SELECT a2.id FROM tableA a2
    LEFT JOIN tableC c on a2.id = c.id)

令人烦恼的是,表C的排除要求将表A与表C进行额外的左连接。不是更直接的方法,而不必再次将表A作为子查询的一部分来连接,是否要做的就是从结果集中排除表C中出现的ID?

谢谢

2 个答案:

答案 0 :(得分:3)

使用不存在的内容:

SELECT a.id, a.ColA, b.ColB
FROM tableA a
LEFT JOIN tableB b ON a.id = b.id
where not exists(select 1 from tablec c where a.id = c.id)

在Oracle中将not in与select一起使用的问题是:

a)它必须返回整个子查询数据集

b)如果为空,则会中断

TOM link regarding these 2 issues

答案 1 :(得分:2)

这行不通吗?

SELECT a.id, a.ColA, b.ColB
FROM tableA a
JOIN tableB b ON a.id = b.id
WHERE a.id NOT IN (SELECT c.Id FROM tableC c)

这也可以在联接中完成

SELECT a.id, a.ColA, b.ColB
FROM tableA a
JOIN tableB b ON a.id = b.id
LEFT JOIN tableC C ON a.id = c.id 
WHERE c.Id is null