【问题标题】:PostgreSQL; Using a SELECT sub-query in an INSERTPostgreSQL;在 INSERT 中使用 SELECT 子查询
【发布时间】:2016-06-21 08:14:16
【问题描述】:

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

这是数据集的一个例子;

 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 语句,以下是可以达到相同结果的缺失语句,但是实际数据集中需要数千个INSERTs,所以我真的想使用为我做的子查询(或类似的):

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

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

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 fassion 中对整个用户列表使用该用户列表:

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

【问题讨论】:

    标签: postgresql subquery


    【解决方案1】:

    您想插入所有'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';
    

    【讨论】:

    • 我不知道这个EXCEPT SELECT... 子句,超级!谢谢:)
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2016-11-14
    • 2022-12-07
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多