0

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

根据每笔交易是否包含特定类型的交易费用,交易需要进行不同的处理——在这种情况下,交易是否包含与 account 相关的拆分8190-000

我设置了两个查询,一个处理有交易费的交易,一个处理没有交易费的交易。查询有效,但它们笨拙且冗长,我相信有更好的方法来做到这一点。我确实看到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;

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

4

1 回答 1

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
);

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

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

于 2022-01-22T22:41:37.597 回答