sql - 如果存在特定记录,则忽略 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”存在,则无法弄清楚如何消除整个联接。
解决方案
你可以使用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;
这假设A.id
并且A.TableA_ID
是不同的列;如果它们相同,那么您根本不需要直接查看表 A,如果您只想要这两列 - 无论如何,您需要的所有信息都在表 B 中。
推荐阅读
- javascript - 将多个 JSON 数据转换为 HTML 表格
- heroku - 将 create-react-app 部署到 Heroku 并忽略 /src 文件夹
- c++ - llvm 为每个堆栈分配添加一个 8 字节元数据
- javascript - 如何在不刷新页面的情况下使用 mvc 将照片上传到服务器?
- c# - 如何在 WinForms C# 中打开多个 XML 文件?
- reactjs - 需要使用带有 Axios 和 React.js 的 TicketMaster API 获取事件
- c - 键盘记录器在 VM 上工作,但不在我的真实计算机上
- python - 匹配后从数据框中复制列
- angular - 带有选项卡的 Angular 6 RouterLink
- json - 将三维 JSON 列表渲染为 FLASK 中的 HTML 模板