【问题标题】:Creating a view with a 'WHERE NOT IN' SQL subquery使用“WHERE NOT IN”SQL 子查询创建视图
【发布时间】:2021-03-17 08:57:07
【问题描述】:

我正在尝试将以下 SQL 查询转换为视图。

SELECT * FROM system_accounts 
WHERE system_accounts.id 
NOT IN (SELECT account_id 
        FROM system_group_members
        WHERE system_group_members.group_id = 1);

换句话说,我如何创建一个视图,为我提供某个组的所有非成员,这些非成员来自系统已知的全部帐户集?

当我在我的管理员窗口中测试它时,查询工作正常。但是,我不知道如何在视图的正确 SQL 中表达变量 group_id(在我的示例中为“1”)。

我确定我错过了一些微不足道的事情,但这是我会在几个小时内猛烈抨击的事情。希望这里的好心人能帮助我。

非常感谢您的宝贵时间。

【问题讨论】:

  • 查看cannot be parametrized。搜索表值函数。其次,如果account_id 可以为空,您的查询可能不会返回任何行
  • 非常感谢您简洁的回答。我会努力从不同的角度来解决我的问题:)
  • 提防NOT IN。如果数据中有空值,它不会像您认为的那样做。最好使用反连接并睡个好觉。

标签: sql view syntax


【解决方案1】:

您可以创建一个包含所有非所有组成员的视图。然后你可以过滤到你想要的组:

CREATE VIEW v_nonmembers AS
    SELECT g.group_id, sa.*
    FROM system_groups g cross join
         system_accounts sa LEFT JOIN
         system_group_members sgm
         ON gsm.group_id = g.group_id AND
            gsm.account_id = sa.id
    WHERE gsm.group_id IS NULL;

然后您可以将其用作:

SELECT *
FROM v_nonmembers
WHERE group_id = 1;

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2022-01-21
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多