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作爲參數。
好,當兩行相同(除了它們的ID)時,如何決定使用哪一行? – NullUserException
第一個結果是好的,稍後會有一個額外的日期檢查(+/- 3天),但即使在那裏,第一個就足夠了。 – Sven
這似乎過於複雜,沒有理由。難道你不能只添加一個像'origin_id'這樣的列,這樣你就可以確切知道哪一個是原始ID?這需要很多猜測,並使其更簡單。 – NullUserException