PostgreSQL的;在INSERT

时间:2016-06-21 08:14:16

标签: 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个,所以我我真的想使用子查询(或类似的)为我做这件事:

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子句吗?

修改

这是我想要做的一个伪示例:

子查询正在选择已定义attrbiute的指定组(人员)中的所有用户,因此我需要在某种NOT IN fassion中对整个用户列表使用该用户列表:< / p>

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

1 个答案:

答案 0 :(得分: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';