SQLite 选择满足/不满足特定条件的事务
SQLite selecting transactions that do / do not meet a particular criteria
我正在尝试从 GnuCash SQLite 数据库中提取数据。相关表格包括 accounts
、transactions
和 splits
。简单来说,accounts
包含transactions
,transactions
又包含splits
,每个拆分点返回一个帐户。
根据每笔交易是否包含特定类型的交易费用,需要对交易进行不同的处理——在这种情况下,交易是否包含链接到账户的拆分 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;
鉴于我需要在其他查询中使用这些结果,有什么更简单、更简洁的方法来获取这些交易列表?
您可以像这样对第一个查询使用 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
,具体取决于哪个 table 包含列 tx_guid
(splits
或 accounts
), 因为你的问题不清楚。
此外,将您的第二个查询更改为 NOT EXISTS
。
我正在尝试从 GnuCash SQLite 数据库中提取数据。相关表格包括 accounts
、transactions
和 splits
。简单来说,accounts
包含transactions
,transactions
又包含splits
,每个拆分点返回一个帐户。
根据每笔交易是否包含特定类型的交易费用,需要对交易进行不同的处理——在这种情况下,交易是否包含链接到账户的拆分 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;
鉴于我需要在其他查询中使用这些结果,有什么更简单、更简洁的方法来获取这些交易列表?
您可以像这样对第一个查询使用 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
,具体取决于哪个 table 包含列 tx_guid
(splits
或 accounts
), 因为你的问题不清楚。
此外,将您的第二个查询更改为 NOT EXISTS
。