3

アカウント情報は PostgreSQL データベースに保存されます。

アカウントは「accounts」テーブルにあり、グループは「grp」テーブルにあり、account_id を grp_id にマップする「account_grp」テーブルによって結び付けられています。

あるグループのメンバーが別のグループのメンバーであるかどうかを検索できるビューを提供するクエリを作成しようとしています。つまり、ビューに「is_in_foobar_group」列が必要なので、SELECT * FROM my_view WHERE grp_id = 1234;元に戻すことができます

username | is_in_foobar_group | grp_id 
---------+--------------------+-------
bob      | true               | 1234
alice    | false              | 1234

foob​​ar ビットはハードコーディングされているため、変更する必要はありません。

助言がありますか?

4

2 に答える 2

6

よりシンプル、高速、便利:

WITH x AS (SELECT 1234 AS foobar)  -- optional, to enter value only once
SELECT a.username
      ,EXISTS (
         SELECT 1 FROM account_grp g 
         WHERE  g.account_id = a.account_id
         AND    g.grp_id = x.foobar
         ) AS is_in_foobar_group
      ,x.foobar AS grp_id
FROM  accounts a, x
于 2013-02-05T16:33:40.927 に答える
1

EXISTS 演算子を使用すると役立つかもしれません: http://www.postgresql.org/docs/9.2/static/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS

SELECT ステートメントで使用できるかどうかはわかりませんが、それを確認するための PostgreSQL インスタンスがありません。最悪の場合、次のような 2 つのクエリを実行する必要があります。

SELECT username, true, grp_id 
FROM accounts a INNER JOIN account_grp g1 on a.account_id = g.account_id
WHERE EXIST (SELECT 1 FROM account_grp g2 
    WHERE g2.account_id = a.account_id and g2.grp_id = [foobar])
UNION
SELECT username, false, grp_id 
FROM accounts a INNER JOIN account_grp g1 on a.account_id = g.account_id
WHERE NOT EXIST (SELECT 1 FROM account_grp g2 
    WHERE g2.account_id = a.account_id and g2.grp_id = [foobar])
于 2013-02-05T15:49:23.983 に答える