Recently, I got a table A
like this:
x
+----------+-----------+---------------+
| VoucherID| AccountID | TransactionID |
+----------+-----------+---------------+
| 48 | 96 | 10 |
+----------+-----------+---------------+
| 48 | 14 | 10 |
+----------+-----------+---------------+
| 37 | 14 | 88 |
+----------+-----------+---------------+
| 37 | 25 | 88 |
+----------+-----------+---------------+
| 57 | 12 | 30 |
+----------+-----------+---------------+
| .
I try to SELF JOIN this table by
SELECT account_log.*, reciprocal_account.AccountID as Reciprocal_accountID
FROM A AS account_log
LEFT JOIN A AS reciprocal_account ON account_log.VoucherID = reciprocal_account.VoucherID
WHERE account_log.AccountID <> reciprocal_account.AccountID
I got this
+----------+-----------+---------------+----------------------+
| VoucherID| AccountID | TransactionID | Reciprocal_accountID |
+----------+-----------+---------------+----------------------+
| 48 | 96 | 10 | 14 |
+----------+-----------+---------------+----------------------+
| 37 | 14 | 88 | 25 |
+----------+-----------+---------------+----------------------+
What I expect is when VoucherID doesn’t have any reciprocal account, that record will return null, like this
+----------+-----------+---------------+----------------------+
| VoucherID| AccountID | TransactionID | Reciprocal_accountID |
+----------+-----------+---------------+----------------------+
| 48 | 96 | 10 | 14 |
+----------+-----------+---------------+----------------------+
| 37 | 14 | 88 | 25 |
+----------+-----------+---------------+----------------------+
| 57 | 12 | 30 | null |
+----------+-----------+---------------+----------------------+
Is there any elegant approach? Thanks all.
Advertisement
Answer
Why not just use aggregation?
select transaction_id, voucher_id,
min(account_id) as account_id,
nullif(max(account_id), min(account_id)) as reciprocal_account_id
from a
group by transaction_id, voucher_id;
You could also do this using left join
:
SELECT account_log.*, reciprocal_account.AccountID as Reciprocal_accountID
FROM A account_log LEFT JOIN
A reciprocal_account
ON account_log.VoucherID = reciprocal_account.VoucherID AND
account_log.AccountID < reciprocal_account.AccountID;