簡體   English   中英

如果存在特定記錄,則忽略 SQL INNER JOIN?

[英]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;

db<>小提琴

這假設A.idA.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM