假设我有一个表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 JOIN
和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;
答案 0 :(得分:0)
AND
关键字应放在WHERE
子句中,而不应放在ON
关键字之后。
SELECT *
FROM transactions x
INNER JOIN transactions y
ON x.`CNTP_ID` = y.`RA_ID`
WHERE (SELECT COLL FROM collaterals WHERE TRNS_ID = x.`ID`) = (SELECT COLL FROM collaterals WHERE TRNS_ID = y.`ID`)
答案 1 :(得分:0)
使用多个联接:
SELECT tx.*, ty.*
FROM transactions tx JOIN
collaterals cx
ON cx.trns_id = tx.id JOIN
transactions ty
ON tx.`CNTP_ID` = ty.`RA_ID` JOIN
collaterals cy
ON cy.trns_id = ty.id AND cy.COLL = cx.COLL;