跳至內容
Astera Technology

要求標籤完全相同,為何多標籤配置也入列?

同時查欠缺及多出的標籤,才能分辨完全相同與只包含必需項的配置。

下載完整個案資料及參考答案 ↓

準備報表輸入

本例須正好 X/Y,不可多項。對齊所有必需標籤,只證明涵蓋子集。兩個 EXCEPT 查兩邊都沒未配對項,才完全相同。C 沒標籤。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:profiles
編號
A
B
C
下載可編輯 CSV ↓
假設輸入:required
標籤
X
Y
下載可編輯 CSV ↓
假設輸入:tags
配置標籤
AX
AY
BX
BY
BZ
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE profiles(id TEXT PRIMARY KEY); CREATE TABLE required(tag TEXT PRIMARY KEY); CREATE TABLE tags(profile TEXT NOT NULL,tag TEXT NOT NULL,PRIMARY KEY(profile,tag)); INSERT INTO profiles VALUES('A'),('B'),('C'); INSERT INTO required VALUES('X'),('Y'); INSERT INTO tags VALUES('A','X'),('A','Y'),('B','X'),('B','Y'),('B','Z');

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT t.profile AS id FROM tags t JOIN required r ON r.tag=t.tag GROUP BY t.profile HAVING COUNT(*)=(SELECT COUNT(*) FROM required) ORDER BY id;
錯誤查詢的逐行結果
編號
A
B
下載可編輯 CSV ↓
更正 SELECT
SELECT p.id FROM profiles p WHERE NOT EXISTS(SELECT tag FROM required EXCEPT SELECT tag FROM tags WHERE profile=p.id) AND NOT EXISTS(SELECT tag FROM tags WHERE profile=p.id EXCEPT SELECT tag FROM required) ORDER BY p.id;
更正查詢的逐行結果
編號
A
下載可編輯 CSV ↓

錯誤有 A、B,但 B 多 Z,更正只有 A。兩邊都要無未配對項;只查必需項會漏掉 B 多出的 Z。

用新副本測邊界

必需集合清空,只有空 C 完全相同,非空 A、B 不合。

另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。

邊界改動及更正查詢
DELETE FROM required;
SELECT p.id FROM profiles p WHERE NOT EXISTS(SELECT tag FROM required EXCEPT SELECT tag FROM tags WHERE profile=p.id) AND NOT EXISTS(SELECT tag FROM tags WHERE profile=p.id EXCEPT SELECT tag FROM required) ORDER BY p.id;
邊界查詢的逐行結果
編號
C
下載可編輯 CSV ↓

B 已有 X、Y,為何仍剔除?

查看參考答案

多 Z 違完全相等;目標空時只有 C 空集合相符。

相關資源