2016-06-21 2 views
0

Я пытаюсь использовать подзапрос 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 

ответ

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'; 
+0

Я не знал об этом 'КРОМЕ SELECT ...' п, супер! Благодаря :) – jwbensley

Смежные вопросы