【发布时间】: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