Я пытаюсь использовать подзапрос SELECT
, чтобы выбрать всех пользователей staff
, у которых есть атрибут Likes tea
, а затем для всех остальных пользователей персонала вставить в таблицу строку для каждого пользователя с атрибутом говоря, что они также любят чай (оказывается, всем нравится чай, но это не было записано, когда были собраны данные таблицы).PostgreSQL; Использование подзапроса SELECT в INSERT
Это пример набора данных;
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 (все пользователи без атрибута «Likes tea») WHERE tu.username!=ts.username ORDER BY tu.username;
Что здесь происходит, это предложение ON, переопределяющее предложение WHERE?
EDIT:
Это псевдо пример того, что я хочу сделать:
Суб-запрос выбора всех пользователей в моей конкретной группе (персонала) с 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
Я не знал об этом 'КРОМЕ SELECT ...' п, супер! Благодаря :) – jwbensley