繁体   English   中英

INNER JOIN和SELECT的组合

[英]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和基于FIELD2FIELD1的几个条件执行自连接,以使事务彼此匹配。 但是,该信息可能不足以完美匹配(请参阅前四个记录)。 因此,我想在另一个字段上进行匹配:报告的基础抵押品(可能有多个项目)。 报告的抵押品存储在表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

我的行销尝试仅在FIELD1FIELD2上尝试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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM