Reputation: 135
I have a data table and a code table, And I want to join one column of the code table to two columns in the data table.
I didn't find a way to join so I tried:
SELECT
A.COLUMN1,
(SELECT CODE_NAME FROM CODE_TABLE B WHERE B.CODE = A.COLUMN2) AS COLUMN2,
(SELECT CODE_NAME FROM CODE_TABLE B WHERE B.CODE = A.COLUMN3) AS COLUMN3
FROM DATA_TABLE A ;
DATA_TABLE
COLUMN1 COLUMN2 COLUMN3
test AA001 BB001
test1 AA002 BB002
test2 AA003 BB003
CODE_TABLE
CODE CODE_NAME
AA001 APPLE
AA002 SAMSUNG
AA003 OPPO
BB001 LG
BB002 HWAWEI
BB003 GOOGLE
How to treat it as a join rather than a subquery?
Upvotes: 0
Views: 97
Reputation: 147166
You can implement it as a JOIN
with two independent JOIN
s to CODE_TABLE
, one for each value in DATA_TABLE
:
SELECT A.COLUMN1,
B1.CODE_NAME AS COLUMN2,
B2.CODE_NAME AS COLUMN3
FROM DATA_TABLE A
JOIN CODE_TABLE B1 ON B1.CODE = A.COLUMN2
JOIN CODE_TABLE B2 ON B2.CODE = A.COLUMN3
If it's possible that a value from COLUMN2
or COLUMN3
in DATA_TABLE
might not exist in CODE_TABLE
, you should use LEFT JOIN
instead, and COALESCE
on the output so as not to return a NULL
value:
SELECT A.COLUMN1,
COALESCE(B1.CODE_NAME, '') AS COLUMN2,
COALESCE(B2.CODE_NAME, '') AS COLUMN3
FROM DATA_TABLE A
LEFT JOIN CODE_TABLE B1 ON B1.CODE = A.COLUMN2
LEFT JOIN CODE_TABLE B2 ON B2.CODE = A.COLUMN3
Output (for your sample data)
COLUMN1 COLUMN2 COLUMN3
test APPLE LG
test1 SAMSUNG HWAWEI
test2 OPPO GOOGLE
Upvotes: 2
Reputation: 9552
SELECT
A.COLUMN1,
B.CODE_NAME AS COLUMN2,
C.CODE_NAME AS COLUMN3
FROM DATA_TABLE AS A
INNER JOIN CODE_TABLE AS B ON B.CODE = A.COLUMN2
INNER JOIN CODE_TABLE AS C ON C.CODE = A.COLUMN3
;
Note: Try and provide proper aliases, rather than A, B, c, in order to increase readability.
Upvotes: 1