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

标签 sql postgresql

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

属性表:

----------------------
  prop_id | prop_name
----------------------
     1    | Email
----------------------
     2    | Phone number
----------------------
     3    | Something else 1
----------------------
     4    | Something else 2
----------------------

user_properties 表:

--------------------------------
  user_id | prop_id | prop_value
--------------------------------
    100   |    1    | asd@zxc.com
--------------------------------
    100   |    2    | 1234567
--------------------------------
    100   |    2    | 2345678
--------------------------------
    101   |    3    | *******
--------------------------------
    101   |    3    | +++++++
--------------------------------

我需要知道每个 user_id 缺少哪些属性。 预期结果应如下所示:

-----------------------
  user_id | missing_prop_id
-----------------------
    100   |    3
-----------------------
    100   |    4
-----------------------
    101   |    1
-----------------------
    101   |    2
-----------------------
    101   |    4
-----------------------

最佳答案

您可以将 except 用作:

with properties(prop_id,prop_name) as
(
  values(1, 'Email'),(2, 'Phone number'),
        (3, 'Something else 1'),(4, 'Something else 2')  
), user_properties(  user_id, prop_id, prop_value) as
(
  values(100,1,'asd@zxc.com'),(100,2,'1234567'),(100,2,'2345678'),
        (101,3,'*******'),(101,3,'+++++++') 
), t2 as
(
select u.user_id, p.prop_id as missing_prop_id
  from user_properties u
 cross join properties p
 group by u.user_id, p.prop_id 
except 
select u.user_id, 
       p.prop_id
  from user_properties u
  right join properties p
    on u.prop_id = p.prop_id
 group by u.user_id, p.prop_id   
) 
select * from t2 order by user_id, missing_prop_id;

user_id      missing_prop_id
100          3
100          4
101          1
101          2
101          4

Demo

关于sql - 如何在另一个表中查找缺少属性 ID 的记录 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57053403/

相关文章:

sql - 按性别列出员 worker 数

php - Laravel 5 与 PostgreSQL

node.js - Sequelize 迁移 - 添加外键约束问题

mysql - 查询加载时间过长

sql - 当我不知道其名称时如何更改 db2 中的检查约束

c# - 无法将参数值从字符串转换为日期时间

sql - sql server如何使用管道字符进行排序

sql - 关于约束

sql - PostgreSQL:不区分大小写的字符串比较

javascript - 从 Jest 中获取正确的堆栈跟踪