INNER JOIN和SELECT

时间:2019-02-14 14:22:30

标签: mysql sql

假设我有一个表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 JOINFIELD1上基于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 JOINFIELD1上尝试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;

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;