首页 > 解决方案 > 如果存在特定记录,则忽略 SQL INNER JOIN?

问题描述

我有两个这样的表加入

SELECT A.id,B.status
FROM TableA A
INNER JOIN TableB B on (A.TableA_ID=B.TableA_ID)
WHERE B.status not in ('CO','CL');

我想显示两个表连接的结果,但如果 TableB 的状态在 ('CO','CL') 中有任何内容,则带有 TableA id 的整个连接将被忽略,而不仅仅是状态不在 ('CO ','CL')。

A.id 和 A.TableA_ID 是不同的列

没有 where 条件的原始结果是这样的:

+------+-----------+
| id   | status    |
+------+-----------+
| 1000 | RE        |
| 1000 | RE        |
| 1000 | RE        |
| 1000 | CO        |
| 2000 | RE        |
| 2000 | RE        |
+------+-----------+

我的结果:

+------+-----------+
| id   | status    |
+------+-----------+
| 1000 | RE        |
| 1000 | RE        |
| 1000 | RE        |
| 2000 | RE        |
| 2000 | RE        |
+------+-----------+

我想要的是:

+------+-----------+
| id   | status    |
+------+-----------+
| 2000 | RE        |
| 2000 | RE        |
+------+-----------+

如果记录“CO”存在,则无法弄清楚如何消除整个联接。

标签: sqloracle

解决方案


你可以使用not exists

SELECT A.id,B.status
FROM TableA A
INNER JOIN TableB B on (A.TableA_ID=B.TableA_ID)
WHERE NOT EXISTS (
  SELECT null
  FROM TableB B
  WHERE B.TableA_ID=A.TableA_ID
  AND B.status in ('CO','CL')
);

或者,如果您只想访问表格,可以使用您不想看到的状态的分析计数,并消除任何非零计数的 ID:

SELECT id, status
FROM (
  SELECT A.id,B.status,
    COUNT(case when B.status in ('CO','CL') then 1 end)
      OVER (partition by A.id) AS cnt
  FROM TableA A
  INNER JOIN TableB B on (A.TableA_ID=B.TableA_ID)
)
WHERE cnt = 0;

db<>小提琴

这假设A.id并且A.TableA_ID是不同的列;如果它们相同,那么您根本不需要直接查看表 A,如果您只想要这两列 - 无论如何,您需要的所有信息都在表 B 中


推荐阅读