準備報表輸入
本例須正好 X/Y,不可多項。對齊所有必需標籤,只證明涵蓋子集。兩個 EXCEPT 查兩邊都沒未配對項,才完全相同。C 沒標籤。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 編號 |
|---|
| A |
| B |
| C |
| 標籤 |
|---|
| X |
| Y |
| 配置 | 標籤 |
|---|---|
| A | X |
| A | Y |
| B | X |
| B | Y |
| B | Z |
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 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 |
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 |
錯誤有 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 |
B 已有 X、Y,為何仍剔除?
查看參考答案
多 Z 違完全相等;目標空時只有 C 空集合相符。