我有3个表,一个Users
表,一个Preferences
表和一个User_Preferences
表。它们看起来像这样:
Users
表:
Preferences
表:
User_Preferences
表:
多年来,添加了许多新的首选项,但现在底层架构已经有所改变。之前,如果User_Preferences
表没有包含某个Preference
的链接,则无论如何,但现在,每个Preference
都需要分配给每个User
。< / p>
所以,如果填充了这三个表,我可以运行什么查询,这会给我一个缺少的User_Preferences
列表?
例如,如果有2个用户和2个权限,并且第一个用户同时拥有两个,但第二个用户拥有一个,则它将为该用户和该权限提供一行
答案 0 :(得分:2)
您可以使用cross join
生成所有组合,然后使用left join
过滤掉现有组合:
select u.*, p.*
from users u cross join
preferences p left join
user_preferences up
on up.user_id = u.user_id and up.preference_id = p.preference_id
where up.user_id is null;
答案 1 :(得分:1)
以下是EXISTS的替代方案。
SELECT p.preference_id,
u.user_id
FROM users u
CROSS JOIN preferences p
WHERE NOT EXISTS
(
SELECT NULL
FROM user_preferences up
WHERE up.user_id = u.user_id
AND up.preference_id = p.preference_id
)
答案 2 :(得分:0)
select u.User_ID, p.Pref_ID from users u, preferences p
minus
select User_ID, Pref_ID from user_preferences