【问题标题】:SQLite selecting transactions that do / do not meet a particular criteriaSQLite 选择满足/不满足特定条件的事务
【发布时间】:2022-01-22 22:27:06
【问题描述】:

我正在尝试从 GnuCash SQLite 数据库中提取数据。相关表包括accounts、transactions和splits。简单来说,accounts 包含transactions,其中包含splits,并且每个拆分都指向一个帐户。

需要对交易进行不同的处理,具体取决于每笔交易是否包含特定类型的交易费用——在这种情况下,交易是否包含与账户 8190-000 关联的拆分。

我设置了两个查询,一个处理有交易费的交易,一个处理没有交易费的交易。查询有效,但它们笨拙且冗长,我相信有更好的方法来做到这一点。我确实在this answer 中看到了not exists,但不知道如何让它在这种情况下工作。

我当前的查询如下所示:

-- Find all transactions containing a split with account code 8190-000
select tx_guid from transactions
inner join
    (select tx_guid from
        (splits inner join accounts on splits.account_guid = accounts.guid)
        where accounts.code = "8190-000") fee_transactions
    on fee_transactions.tx_guid = transactions.guid;
-- Find all transactions not containing a split with account code 8190-000
select guid from transactions
except
select tx_guid from transactions
inner join
    (select tx_guid from
        (splits inner join accounts on splits.account_guid = accounts.guid)
        where accounts.code = "8190-000") fee_transactions
    on fee_transactions.tx_guid = transactions.guid;

鉴于我需要在其他查询中使用这些结果,有什么更简单、更简洁的方法来获取这些交易列表?

【问题讨论】:

    标签: sql sqlite join exists gnucash


    【解决方案1】:

    您可以像这样将 EXISTS 用于您的第一个查询:

    SELECT t.* 
    FROM transactions t
    WHERE EXISTS (
      SELECT 1 
      FROM splits s INNER JOIN accounts a
      ON s.account_guid = a.guid
      WHERE a.code = '8190-000' AND ?.tx_guid = t.guid
    );
    

    将? 更改为s 或a,具体取决于哪个表包含tx_guid 列(splits 或accounts),因为您的问题不清楚。

    另外,为您的第二个查询更改为 NOT EXISTS。

    【讨论】:

    • 感谢新手。这对我有用,它还使我更大的查询易于管理。
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2014-02-18
    • 1970-01-01
    • 2017-10-22
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多