Sql 如何在另一个表中查找缺少属性ID的记录ID

Sql 如何在另一个表中查找缺少属性ID的记录ID,sql,postgresql,Sql,Postgresql,PostgreSQL数据库有两个表:用户属性和属性。properties表包含所有可能的带有id的属性的列表(字典)。user_properties表包含用户拥有的属性,并引用properties表中的属性id 属性表: ---------------------- prop_id | prop_name ---------------------- 1 | Email ---------------------- 2 | Phone number -----

PostgreSQL数据库有两个表:用户属性和属性。properties表包含所有可能的带有id的属性的列表(字典)。user_properties表包含用户拥有的属性,并引用properties表中的属性id

属性表:

----------------------
  prop_id | prop_name
----------------------
     1    | Email
----------------------
     2    | Phone number
----------------------
     3    | Something else 1
----------------------
     4    | Something else 2
----------------------
--------------------------------
  user_id | prop_id | prop_value
--------------------------------
    100   |    1    | asd@zxc.com
--------------------------------
    100   |    2    | 1234567
--------------------------------
    100   |    2    | 2345678
--------------------------------
    101   |    3    | *******
--------------------------------
    101   |    3    | +++++++
--------------------------------
用户属性表:

----------------------
  prop_id | prop_name
----------------------
     1    | Email
----------------------
     2    | Phone number
----------------------
     3    | Something else 1
----------------------
     4    | Something else 2
----------------------
--------------------------------
  user_id | prop_id | prop_value
--------------------------------
    100   |    1    | asd@zxc.com
--------------------------------
    100   |    2    | 1234567
--------------------------------
    100   |    2    | 2345678
--------------------------------
    101   |    3    | *******
--------------------------------
    101   |    3    | +++++++
--------------------------------
我需要知道每个用户id缺少哪些属性。 预期结果应如下所示:

-----------------------
  user_id | missing_prop_id
-----------------------
    100   |    3
-----------------------
    100   |    4
-----------------------
    101   |    1
-----------------------
    101   |    2
-----------------------
    101   |    4
-----------------------
您可以将其用作:


您可以通过加入

SELECT DISTINCT t3.user_id, t3.prop_id FROM 
(SELECT DISTINCT user_id, t2.prop_id FROM user_properties t1, properties t2) t3 
LEFT JOIN user_properties t4 ON t3.user_id = t4.user_id and t3.prop_id = t4.prop_id WHERE t4.prop_id is null

您可以使用
交叉联接
生成所有行,并使用
左联接
过滤不存在的行:

select u.user_id, p.prop_id
from (select distinct user_id from user_properties
     ) u cross join
     properties p left join
     user_properties up
     on up.user_id = u.user_id and
        up.prop_id = p.prop_id
where up.user_id is null;
假设您有一个
users
表,因此不需要
u
的子查询:

select u.user_id, p.prop_id
from users u cross join
     properties p left join
     user_properties up
     on up.user_id = u.user_id and
        up.prop_id = p.prop_id
where up.user_id is null;

谢谢大家的帮助。我自己提出了以下问题:

select mp.user_id, mp.prop_id missing_prop_id from
(select distinct up.user_id, p.prop_id from user_properties up cross join properties p) mp
except
select distinct user_id, prop_id from user_properties

请注意,那些提供样本数据的
union
查询可以简化为
值(1,'电子邮件'),(2,'电话号码'),…
Woww,非常好的功能danke@a_horse_,带_no_name。耶:)谢谢!我也想到了,除了:)刚刚发布了答案。@ArlenKeshabyan不错。只需要订购。