SQL- 如何合并 3 个表得到这个结果?
SQL- How to combine 3 tables to get this result?
SNO 似乎误导了
所以,我进一步简化了问题
--creation
CREATE TABLE LAB (JOB_ID int, LAB_ID VARCHAR(50));
CREATE TABLE SPR (JOB_ID int, SPR_ID VARCHAR(50));
--Table 1 data insertion
INSERT INTO LAB (JOB_ID, LAB_ID) VALUES(10, 'LAB_10');
INSERT INTO LAB (JOB_ID, LAB_ID) VALUES(10, 'LAB_20');
INSERT INTO LAB (JOB_ID, LAB_ID) VALUES(10, 'LAB_30');
--Table 2 data insertion
INSERT INTO SPR (JOB_ID, SPR_ID) VALUES(10, 'SPR_10');
INSERT INTO SPR (JOB_ID, SPR_ID) VALUES(10, 'SPR_20');
我试过的查询
SELECT L.JOB_ID, L.LAB_ID, S.SPR_ID
FROM LAB L
JOIN SPR S ON S.JOB_ID = L.JOB_ID
我得到的结果
JOB_ID LAB_ID SPR_ID
10 LAB_10 SPR_20
10 LAB_10 SPR_10
10 LAB_20 SPR_20
10 LAB_20 SPR_10
10 LAB_30 SPR_20
10 LAB_30 SPR_10
我需要的结果
JOB_ID LAB_ID SPR_ID
10 LAB_10 SPR_10
10 LAB_20 SPR_20
10 LAB_30 空
检查这个:
WITH
cte1 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY job_id ORDER BY lab_id) rn
FROM lab ),
cte2 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY job_id ORDER BY spr_id) rn
FROM spr ),
cte3 AS ( SELECT rn, job_id FROM cte1
UNION
SELECT rn, job_id FROM cte2 )
SELECT cte1.job_id, cte1.lab_id, cte2.spr_id
FROM cte3
LEFT JOIN cte2 ON cte3.rn = cte2.rn AND cte3.job_id = cte2.job_id
LEFT JOIN cte1 ON cte3.rn = cte1.rn AND cte3.job_id = cte1.job_id
SNO 似乎误导了 所以,我进一步简化了问题
--creation
CREATE TABLE LAB (JOB_ID int, LAB_ID VARCHAR(50));
CREATE TABLE SPR (JOB_ID int, SPR_ID VARCHAR(50));
--Table 1 data insertion
INSERT INTO LAB (JOB_ID, LAB_ID) VALUES(10, 'LAB_10');
INSERT INTO LAB (JOB_ID, LAB_ID) VALUES(10, 'LAB_20');
INSERT INTO LAB (JOB_ID, LAB_ID) VALUES(10, 'LAB_30');
--Table 2 data insertion
INSERT INTO SPR (JOB_ID, SPR_ID) VALUES(10, 'SPR_10');
INSERT INTO SPR (JOB_ID, SPR_ID) VALUES(10, 'SPR_20');
我试过的查询
SELECT L.JOB_ID, L.LAB_ID, S.SPR_ID
FROM LAB L
JOIN SPR S ON S.JOB_ID = L.JOB_ID
我得到的结果
JOB_ID LAB_ID SPR_ID
10 LAB_10 SPR_20
10 LAB_10 SPR_10
10 LAB_20 SPR_20
10 LAB_20 SPR_10
10 LAB_30 SPR_20
10 LAB_30 SPR_10
我需要的结果
JOB_ID LAB_ID SPR_ID
10 LAB_10 SPR_10
10 LAB_20 SPR_20
10 LAB_30 空
检查这个:
WITH
cte1 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY job_id ORDER BY lab_id) rn
FROM lab ),
cte2 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY job_id ORDER BY spr_id) rn
FROM spr ),
cte3 AS ( SELECT rn, job_id FROM cte1
UNION
SELECT rn, job_id FROM cte2 )
SELECT cte1.job_id, cte1.lab_id, cte2.spr_id
FROM cte3
LEFT JOIN cte2 ON cte3.rn = cte2.rn AND cte3.job_id = cte2.job_id
LEFT JOIN cte1 ON cte3.rn = cte1.rn AND cte3.job_id = cte1.job_id