假設我們有以下 3 個表
Animal
id name
1 dog
2 cat
3 crow
Actions
id name
1 run
2 walk
3 jump
4 fly
5 puppy_eyes
6 swim
Animal_Actions
id Animal_id action_id
1 1 1
2 1 2
3 1 3
4 1 5
5 2 1
6 2 2
7 2 3
8 3 2
9 3 4
我想為某些動物找到所有缺失的動物動作
例如,如果我們輸入 dog 和 cat(id 1 和 2),我們應該得到以下資訊(1,4),(1,6),(2,4),(2,5), (2,6)
如果我們輸入 crow (3) 我們會得到以下結果(3,1),(3,3),(3,5), (3,6)。
目前,我正在根據動物 ID 在 Animal 和 Animal_Actions 表之間進行內部連接,并將其匯入我的代碼中的 SET 中,并檢查該集合中是否存在所有可能的排列并收集缺失的排列。我不確定我遵循的程序是否是最有效的程序,當資料規模很大時,是否有更好的方法來做到這一點?提前致謝。
uj5u.com熱心網友回復:
如果您要過濾少量Animal記錄,一種方法是對表進行CROSS JOINActions。這將為您提供每條Animal記錄的所有操作組合。然后執行OUTER JOIN來Animal_Actions確定缺少哪些。
例如,使用 cat = 2 和 dog = 1
SELECT ani.id AS Animal_Id , ani.Name AS Animal_Name , act.id AS Action_Id , act.Name AS Action_Name FROM Animal ani CROSS JOIN Actions act LEFT JOIN Animal_Actions aa ON ani.id = aa.Animal_id AND aa.Action_Id = act.id WHERE ani.id IN (1,2) AND aa.id IS NULL ORDER BY ani.Name, act.Name ;
結果:
動物_ID | 動物名稱 | Action_Id | Action_Name
--------: | :------------ | --------: | :----------
2 | 貓 | 4 | 飛
2 | 貓 | 5 | 小狗的眼睛
2 | 貓 | 6 | 游泳
1 | 狗 | 4 | 飛
1 | 狗 | 6 | 游泳
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/444082.html
