【发布时间】:2019-02-15 22:27:36
【问题描述】:
假设我有一个表 transactions 包含报告的金融交易,其中交易报告的双方(TRNS_ID 是交易 ID,RA_ID 是报告代理 ID,CNTP_ID 是交易对手 ID)
ID, RA_ID, CNTP_ID, FIELD1, FIELD2
1 A B 0.1 0.1
2 B A 0.1 0.1
---------------------------------------
3 A B 0.1 0.1
4 B A 0.1 0.1
---------------------------------------
5 B C 0.1 0.1
6 C B 0.1 0.1
因此,对于发生在两个代理之间的每笔交易,我都有一个冗余记录,我想删除它(为了说明,我将属于一起的交易按行分开)。问题是从许多记录中识别出两个交易,可能涉及相同的代理。
为此,我使用INNER JOIN 和基于FIELD1 的几个标准在FIELD2 上执行自联接以相互匹配事务。但是,这些信息可能不足以完美匹配(参见前四条记录)。因此,我想在另一个字段上进行匹配:报告的底层抵押品(可能是多个项目)。报告的抵押品存储在表collaterals 中,其中TRNS_ID 是外键
ID, COLL, TRNS_ID
1 F 1
2 G 1
3 G 2
4 F 2
-----------
5 H 3
6 H 4
-----------
7 I 5
8 I 6
问题:如何在INNER JOIN查询中强加交易双方上报的抵押品相同的条件?
我想要的结果是
RA_TRNS_ID, RA_ID, CNTP_ID, CNTP_TRNS_ID, FIELD1, FIELD2
1 A B 2 0.1 0.1
3 B C 4 0.1 0.1
5 B C 6 0.1 0.1
我当前仅尝试INNER JOINs 对FIELD1 和FIELD2,但是这是不完美的匹配,因为我无法区分前两组交易。
SELECT
x.`TRNS_ID` AS x.`RA_TRNS_ID`,
y.`TRNS_ID` AS y.`CNTP_TRNS_ID`,
x.`FIELD1` as `RA_FIELD1`,
y.`FIELD1` as `CNTP_FIELD1`,
x.`FIELD2` as `RA_FIELD2`,
y.`FIELD2` as `CNTP_FIELD2`
FROM transactions x
INNER JOIN transactions y
ON x.`CNTP_ID` = y.`RA_ID` AND x.`FIELD1` = y.`FIELD1` AND x.`FIELD2` = y.`FIELD2`
GROUP BY `RA_FIELD1`, `CNTP_FIELD1`, `RA_FIELD2`, `CNTP_FIELD2`
HAVING COUNT(*) = 2;
【问题讨论】: