Сочетание внутреннего присоединения и выбора - PullRequest
0 голосов
/ 14 февраля 2019

Предположим, у меня есть таблица transactions с отчетными финансовыми операциями, где обе стороны отчета о транзакциях (TRNS_ID - это идентификатор транзакции, RA_ID - это идентификатор агента отчетности, CNTP_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;

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Использовать несколько объединений:

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;
0 голосов
/ 14 февраля 2019
Ключевое слово

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`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...