我正在尝试使用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
答案 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';