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
一致するパートナーがない行は表示しないでください。すべての行は、最大で1つの他のトランザクションにしか一致できません。GROUP BYを試してみましたが、 q1.idとq2.idをパラメーターとして使用できませんでした。