我们将帐户信息存储在PostgreSQL数据库中。
帐户位于“帐户”表中,“grp”表中的组,并且它们通过“account_grp”表绑定在一起,该表将account_id映射到grp_id。
我正在尝试制作一个查询,它会给我一个视图,让我可以搜索一个组的成员是否是另一个组的成员,即我在视图中想要一个“is_in_foobar_group”列,所以我可以{{ 1}}然后回来
SELECT * FROM my_view WHERE grp_id = 1234;
foobar位是硬编码的,不需要更改。
有什么建议吗?
答案 0 :(得分:5)
更简单,更快捷,更方便:
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
答案 1 :(得分: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])