我试图使用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
我不知道这个'EXCEPT SELECT ...'条款,超强!谢谢 :) – jwbensley