I have table A where each IDENTIFIER value is unique. Depending on whether its CC or DC, I need to join it with different tables, for example if its “CC_” I need to map it to table B and if its “DC_” I need to map it to table C.
TABLE A:
ID | IDENTIFIER 1 | CC_1234567 2 | DC_9494949
TABLE B:
ID| SOURCE. |INSTRUMENT 7 | 1234567. | 545454
TABLE C:
ID | SOURCE | INSTRUMENT 8 |. 9494949 |. 63636363
I want the result to look like this:
IDENTIFIER | INSTRUMENT CC_1234567 | 545454 DC_9494949 | 63636363
First of all, how could I just get “1234567” from “CC_1234567” and second when writing a join query, I would get other columns in the final resulting table, such as B.INSTRUMENT, C.INSTRUMENT. Each IDENTIFIER in table A only maps to either table B OR table C.
Select A.IDENTIFIER, B.INSTRUMENT, C.INSTRUMENT from table.A inner join table.A on A.IDENTIFIER=B.INSTRUMENT AND A.IDENTIFIER=C.INSTRUMENT
Advertisement
Answer
You can left join
twice, and then use coalesce()
in the select
clause:
select a.identifier, coalesce(b.instrument, c.instrument) instrument from tablea left join tableb b on a.identifier = concat('CC_', b.source) left join tablec c on a.identifier = concat('DC_', c.source)
If there are matches in both tables, the above query gives priority to tableb
.
If you want to exclude rows that have no match in either tables, then you can add the following where
clause:
where a.source is not null or b.source is not null