sql - 如何找出哪些行匹配而每行没有多个结果?

标签 sql sqlite unique matching

在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作为参数。

最佳答案

由于可能会有几行具有相同的本地/远程/值值,
为了正确地配对行,必须计算每个这样的组中行的等级。

使用其他数据库比使用sqlite(使用行编号基元,CTE等)要容易得多,但是在sqlite中,可以这样获得正确的结果:

SELECT t1.id, t1.local, t1.remote, t1.value,
t2.id, t2.local, t2.remote, t2.value FROM
(SELECT q1.*, count(q1b.id) AS rank
FROM entries q1 LEFT JOIN entries q1b
ON q1.local = q1b.local AND q1.remote = q1b.remote
AND q1.value = q1b.value AND q1.id >= q1b.id
GROUP BY q1.id) AS t1,
(SELECT q2.*, count(q2b.id) AS rank
FROM entries q2 LEFT JOIN entries q2b
ON q2.local = q2b.local AND q2.remote = q2b.remote
AND q2.value = q2b.value AND q2.id >= q2b.id
GROUP BY q2.id) AS t2
WHERE t1.local = t2.remote AND t1.remote = t2.local
AND t1.value = - t2.value
AND t1.id < t2.id AND t1.rank = t2.rank


http://sqlfiddle.com/#!5/c684e/66/0

关于sql - 如何找出哪些行匹配而每行没有多个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402007/

相关文章:

php - SQL从另一个查询中选择多个值

ruby - 如何从 Ruby 中的哈希数组中获取唯一元素?

sql - 禁用主键并在 SQL 批量插入后重新启用

mysql - 使用 Tcl 连接到 MySQL

sqlite-net - 按字符串排序,不区分大小写,不区分重音

sqlite - 在SQLite中实现/使用外键?

Java:唯一的 10 位 ID

C:将不同的单词保存到链表中

mysql - 如何按日期和 ID 删除 MySQL 表上的重复项?

sql - 如何使用特定范围的随机数更新表的字段