Предположим, у меня есть таблица 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;