在 SQLite 中,我有一个这样创建的表(简化):
CREATE TABLE [entries] (
[id] INTEGER NOT NULL PRIMARY KEY,
[local] VARCHAR,
[remote] VARCHAR,
[value] INTEGER
);
INSERT INTO entries (local, remote, value) VALUES ("a", "b", 1);
INSERT INTO entries (local, remote, value) VALUES ("b", "a", -1);
INSERT INTO entries (local, remote, value) VALUES ("b", "a", -1);
INSERT INTO entries (local, remote, value) VALUES ("a", "d", 2);
INSERT INTO entries (local, remote, value) VALUES ("a", "d", 2);
INSERT INTO entries (local, remote, value) VALUES ("d", "a", -2);
现在我想列出相互匹配的组合。将本地列视为本地银行帐户,将远程列视为远程银行帐户。每当一个事务从本地到远程进行,值为x并且存在一个匹配的事务,它接收到值x但作为负值(相对于第一个找到的值),我希望从 SQLite 获得输出。
我目前的做法是这样的:
sqlite3 -header demo.db \
"SELECT * FROM
(SELECT * FROM entries) AS q1,
(SELECT * FROM entries) AS q2
WHERE q1.local = q2.remote AND
q1.remote = q2.local AND
q1.value = (q2.value * -1)"
但这会返回:
id|local|remote|value|id|local|remote|value
1|a|b|1|2|b|a|-1
1|a|b|1|3|b|a|-1
2|b|a|-1|1|a|b|1
3|b|a|-1|1|a|b|1
4|a|d|2|6|d|a|-2
5|a|d|2|6|d|a|-2
6|d|a|-2|4|a|d|2
6|d|a|-2|5|a|d|2
我想要的结果是:
id|local|remote|value|id|local|remote|value
1|a|b|1|2|b|a|-1
4|a|d|2|6|d|a|-2
不应显示没有匹配伙伴的行 - 每行最多只能匹配一个其他交易。我尝试使用GROUP BY,但这不适用于q1.id和q2.id作为参数。