2016-06-21 74 views
0

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

这是数据集的一个例子;

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 S,只是选择他们,以确保我有正确的最接近用户列表):

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;

这里发生了什么,WHERE子句中的ON子句是什么?

编辑

这是我所想要做一个假例如:

子查询中选择在我指定的组(工作人员)的所有用户提供attrbiute已经定义,所以我需要使用某种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 

回答

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'; 
+0

我不知道这个'EXCEPT SELECT ...'条款,超强!谢谢 :) – jwbensley