[英]Combination of INNER JOIN and SELECT
假设我有一个已报告财务交易的表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
和基于FIELD2
上FIELD1
的几个条件执行自连接,以使事务彼此匹配。 但是,该信息可能不足以完美匹配(请参阅前四个记录)。 因此,我想在另一个字段上进行匹配:报告的基础抵押品(可能有多个项目)。 报告的抵押品存储在表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
我的行销尝试仅在FIELD1
和FIELD2
上尝试INNER JOIN
,但是这是不完美的匹配,因为我无法区分前两组交易。
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;
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`)
使用多个联接:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.