使用PL / SQL查找缺失的关系

时间:2014-08-12 15:11:04

标签: sql oracle

我有3个表,一个Users表,一个Preferences表和一个User_Preferences表。它们看起来像这样:

Users表:

  • User_ID :主键
  • User_Name :用户名
  • ......其他不重要的领域

Preferences表:

  • Pref_ID :主键
  • Pref_Name :首选项名称
  • ......其他不重要的领域

User_Preferences表:

  • Pref_ID :首选项用户
  • User_ID :正在设置首选项
  • Pref_Val :偏好的价值

多年来,添加了许多新的首选项,但现在底层架构已经有所改变。之前,如果User_Preferences表没有包含某个Preference的链接,则无论如何,但现在,每个Preference都需要分配给每个User。< / p>

所以,如果填充了这三个表,我可以运行什么查询,这会给我一个缺少的User_Preferences列表?

例如,如果有2个用户和2个权限,并且第一个用户同时拥有两个,但第二个用户拥有一个,则它将为该用户和该权限提供一行

3 个答案:

答案 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