I have two tables as below:
Table Apple:
x
+----------+----------+---------+
| APPLE_ID | PHONE_ID | IPAD_ID |
+----------+----------+---------+
| 1 | 1001 | 2001 |
| 2 | 1002 | 2002 |
| 3 | 1003 | 2003 |
| 4 | 1004 | 2004 |
+----------+----------+---------+
Table KEEY:
+---------+----------+--------+-----------+
| KEEY_ID | NAME | DTL_ID | DEVICE_ID |
+---------+----------+--------+-----------+
| 1 | PHONE_ID | 1001 | 111 |
| 2 | PHONE_ID | 2001 | 111 |
| 3 | IPAD_ID | 2001 | 222 |
| 4 | PHONE_ID | 1003 | 444 |
| 5 | MAC_ID | 367 | 333 |
+---------+----------+--------+-----------+
Desired Output:
+----------+----------+---------+-----------------+----------------+
| APPLE_ID | PHONE_ID | IPAD_ID | PHONE_DEVICE_ID | IPAD_DEVICE_ID |
+----------+----------+---------+-----------------+----------------+
| 1 | 1001 | 2001 | 111 | 222 |
| 3 | 1003 | 2003 | 444 | null |
+----------+----------+---------+-----------------+----------------+
Code Tried So far:
SELECT
APPLE.APPLE_ID,
APPLE.PHONE_ID,
APPLE.IPAD_ID,
NULL AS IPHONE_DEVICE_ID,
KY.DEVICE_ID AS IPAD_DEVICE_ID
FROM APPLE
LEFT JOIN KEEY KY ON APPLE.IPAD_ID=KY.DTL_ID WHERE KY.NAME='IPAD_ID'
UNION
SELECT
APPLE.APPLE_ID,
APPLE.PHONE_ID,
APPLE.IPAD_ID,
KY.DEVICE_ID AS PHONE_DEVICE_ID,
NULL AS IPAD_DEVICE_ID
FROM APPLE
LEFT JOIN KEEY KY ON APPLE.PHONE_ID=KY.DTL_ID WHERE KY.NAME='PHONE_ID'
This is giving me :
+----------+----------+---------+------------------+----------------+
| APPLE_ID | PHONE_ID | IPAD_ID | IPHONE_DEVICE_ID | IPAD_DEVICE_ID |
+----------+----------+---------+------------------+----------------+
| 1 | 1001 | 2001 | 111 | (null) |
| 1 | 1001 | 2001 | (null) | 222 |
| 3 | 1003 | 2003 | 444 | (null) |
+----------+----------+---------+------------------+----------------+
I guess i need to use pivot instead of Union to get both the ids on same row.
Have you ever encountered such scenarios? Any pointers to proceed will be very helpful.
Thanks in Advance!
DDL used for the above problem:
CREATE TABLE APPLE
( APPLE_ID INTEGER,
PHONE_ID INTEGER,
IPAD_ID INTEGER);
INSERT INTO APPLE VALUES (1,1001,2001);
INSERT INTO APPLE VALUES (2,1002,2002);
INSERT INTO APPLE VALUES (3,1003,2003);
INSERT INTO APPLE VALUES (4,1004,2004);
CREATE TABLE KEEY
( KEEY_ID INTEGER,
NAME VARCHAR2(50),
DTL_ID INTEGER,
DEVICE_ID INTEGER);
INSERT INTO KEEY VALUES (1,'PHONE_ID',1001,111);
INSERT INTO KEEY VALUES (2,'PHONE_ID',2001,111);
INSERT INTO KEEY VALUES (3,'IPAD_ID',2001,222);
INSERT INTO KEEY VALUES (4,'PHONE_ID',1003,444);
INSERT INTO KEEY VALUES (5,'MAC_ID',367,333);
Advertisement
Answer
I think you just want two joins:
select a.*, k1.device_id as phone_id, d2.device_id as ipad_id
from apple a join
keey k1
on a.phone_id = k1.dtl_id and k1.name = 'PHONE_ID' left join
keey k2
on a.ipad_id = k2.dtl_id and k2.name = 'IPAD_ID';
Here is a db<>fiddle (it uses Postgres just because that is easier to set up in the fiddle, but the results should be the same).