2016-06-21 4 views
0

サブクエリを使用してLikes teaの属性を持つすべてのstaffユーザーを選択し、他のすべてのスタッフのユーザーは属性を持つ各ユーザーの行をテーブルに挿入しようとしています彼らはまたお茶を好むと言っている(誰もがお茶を好きだが、それはテーブルのデータが集まったときに記録されなかった)。PostgreSQL;

これはデータセットの例です。以下は

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 Sを作成しない(すべてのユーザーを選択することになってきた最も近いですユーザーリスト):

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;

ここでは、WHERE節を上書きするON句がありますか?

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 EXCEPT ...'句、スーパー知りませんでした!ありがとう:) – jwbensley