[英]Ignore SQL INNER JOIN if specific record exist?
我有兩個這樣的表加入
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 中。
這是一種方法:
SELECT A.id,B.status
FROM TableA A
INNER JOIN TableB B on (A.TableA_ID=B.TableA_ID)
WHERE not exists ( select 1 from TableB B where A.TableA_ID=B.TableA_ID and B.status in ('CO','CL')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.