サブクエリを使用して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
私はこの 'SELECT EXCEPT ...'句、スーパー知りませんでした!ありがとう:) – jwbensley