3

我们将帐户信息存储在 PostgreSQL 数据库中。

帐户在“accounts”表中,组在“grp”表中,它们由“account_grp”表绑定在一起,该表将 account_id 映射到 grp_id。

我正在尝试制作一个查询,它会给我一个视图,让我搜索一个组的成员是否是另一个组的成员,即我想要视图中有一个“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 回答