PostgreSQL;在 INSERT 中使用 SELECT 子查询

标签 postgresql subquery

我正在尝试使用 SELECT选择全部 staff 的子查询具有 Likes tea 属性的用户然后对于所有其他员工用户,在表中为每个用户插入一行,其属性表示他们也喜欢茶(事实证明每个人都喜欢茶,但收集表数据时没有记录)。

这是数据集的示例;

 tbl_users:
 user | attribute     
------+---------------
 dave | Likes tea     
 dave | Likes coffee  
 alan | Likes tea     
 fred | Likes juice   
 fred | Likes water   
 john | Likes cola    

 tbl_groups:
 user | group
------+---------------
 dave | staff         
 alan | staff         
 fred | staff         
 john | staff         
 neil | non-staff     
 tony | non-staff     

下面是缺少的语句,如果我单独写出所有必需的INSERT,它们将获得相同的结果。声明,然而有数千个INSERT真实数据集中需要 s,所以我真的想使用子查询(或类似的查询)来为我做到这一点:

INSERT INTO tbl_users (user, attribute) VALUES ('fred', 'Likes tea');
INSERT INTO tbl_users (user, attribute) VALUES ('john', 'Likes tea');

这是我最接近选择所有用户的情况(不创建所需的 INSERT ,只是选择它们以确保我拥有正确的用户列表):

SELECT DISTINCT(tu.username) FROM tbl_users tu LEFT JOIN 

    (
     SELECT u.username FROM tbl_users u INNER JOIN tbl_groups g
     ON (u.username=g.username)
     WHERE g.groupname = 'staff' and u.attribute = 'Likes tea'
     ) AS ts

ON tu.username=ts.username
WHERE tu.username!=ts.username ORDER BY tu.username;

问题是这会返回 tbl_users 中列出的每个用户。我认为问题出在 LEFT JOIN到子查询,但是单独运行该子查询只会成功返回喜欢茶的用户列表,因此我期望这部分从 tbl_users 中选择逆用户集(所有没有“喜欢茶”的用户)属性)WHERE tu.username!=ts.username ORDER BY tu.username;

这是怎么回事,ON 子句是否覆盖了 WHERE 子句?

编辑:

这是我想做的事情的伪示例:

子查询正在选择我指定组(员工)中已定义属性的所有用户,因此我需要以某种形式使用该用户列表 NOT IN对整个用户列表的喜爱:

for each (username from list of all users)
  if username NOT IN (sub-query of users who already have the attribute)
  then
    add attribute to this user
  fi
next

最佳答案

您想要插入所有'staff'用户,除了已经'Likes tea'的用户,对吗?

将其转换为 SQL,您将得到:

INSERT INTO tbl_users (username, attribute)
   SELECT username, VARCHAR 'Likes tea' AS attribute
      FROM tbl_groups
      WHERE groupname = 'staff'
   EXCEPT SELECT username, 'Likes tea'
      FROM tbl_users
      WHERE attribute = 'Likes tea';

关于PostgreSQL;在 INSERT 中使用 SELECT 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37938986/

相关文章:

sql - 按产品类别名称排序行

SQL LIKE 条件检查整数?

mysql - 如何在子查询中使用 HAVING 作为 Select 语句的一部分

mysql - 使用内连接、左连接或右连接来连接 2 个表

postgresql - Postgres : NOT IN array instead of NOT EXISTS expression

java - 在 Postgres 上使用 JPA/Spring Boot 生成标题大小写字段

sql - Rails - 如何防止 postgres find_by_sql 查询的 sql 注入(inject)?

php - mysql 如何通过查询父级来获取子级的最小id

mysql 运行总计作为 View

mysql - SQL查询结果结构