我正在尝试使用 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
真实数据集中需要 s,所以我真的想使用子查询(或类似的查询)来为我做到这一点:
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 子句?
编辑:
这是我想做的事情的伪示例:
子查询正在选择我指定组(员工)中已定义属性的所有用户,因此我需要以某种形式使用该用户列表 NOT IN
对整个用户列表的喜爱:
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
最佳答案
您想要插入所有'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';
关于PostgreSQL;在 INSERT 中使用 SELECT 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37938986/