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