并排合并三个表

问题描述 投票:0回答:1

我知道这是一个奇怪的请求,但我所在的公司有一个为 Excel 宏构建的 Java 程序,可以以这种方式格式化它。我需要三个表:dibbs_nobid、dibbs_lost 和 dibbs_won。有一篇类似的文章,有两个表,但我似乎无法将最后一个表添加到该表中。

三张表如下:

nsn_part_number 原因
1 原因1
2 原因2
nsn_part_number 原因
1 原因1
2 原因2
nsn_part_number 原因
1 原因1
2 原因2

我想要达到以下结果:

nsn_part_number 原因 nsn_part_number 原因 nsn_part_number 原因
1 原因1 3 原因3 5 原因5
2 原因2 4 原因4 6 原因6

下面是我用来合并两个表的查询:

SELECT 
    dibbs_nobid.nsn_part_number,
    dibbs_nobid.reason,
    dibbs_lost.nsn_part_number,
    dibbs_lost.reason 
FROM 
    (SELECT 
        dn.*, 
        ROW_NUMBER() OVER (ORDER BY nsn_part_number) AS seqnum 
    FROM 
        dibbs_nobid dn
    ) dibbs_nobid
FULL OUTER JOIN 
    (SELECT 
       dl.*, 
       ROW_NUMBER() OVER (ORDER BY nsn_part_number) AS seqnum 
    FROM 
        dibbs_lost dl
    ) dibbs_lost
ON 
    dibbs_nobid.seqnum = dibbs_lost.seqnum;
sql postgresql
1个回答
1
投票

为了可重复性,请考虑在此类问题中包含对象和数据创建脚本。

假设以下脚本复制您的场景:

CREATE TABLE dibbs_nobid (
    nsn_part_number INT,
    reason VARCHAR(255)
);

CREATE TABLE dibbs_lost (
    nsn_part_number INT,
    reason VARCHAR(255)
);

CREATE TABLE dibbs_won (
    nsn_part_number INT,
    reason VARCHAR(255)
);
INSERT INTO dibbs_nobid (nsn_part_number, reason) VALUES
(1, 'reason1'),
(2, 'reason2');

INSERT INTO dibbs_lost (nsn_part_number, reason) VALUES
(3, 'reason3'),
(4, 'reason4');

INSERT INTO dibbs_won (nsn_part_number, reason) VALUES
(5, 'reason5'),
(6, 'reason6');

即使业务逻辑不完全清晰,您也可以通过调整您的查询来达到预期的结果,如下所示:

SELECT 
    dibbs_nobid.nsn_part_number,
    dibbs_nobid.reason,
    dibbs_lost.nsn_part_number,
    dibbs_lost.reason,
    dibbs_won.nsn_part_number,
    dibbs_won.reason
FROM 
    (SELECT 
        dn.*, 
        ROW_NUMBER() OVER (ORDER BY nsn_part_number) AS seqnum 
    FROM 
        dibbs_nobid dn
    ) dibbs_nobid
FULL OUTER JOIN 
    (SELECT 
        dl.*, 
        ROW_NUMBER() OVER (ORDER BY nsn_part_number) AS seqnum 
    FROM 
        dibbs_lost dl
    ) dibbs_lost
ON 
    dibbs_nobid.seqnum = dibbs_lost.seqnum
FULL OUTER JOIN 
    (SELECT 
        dw.*, 
        ROW_NUMBER() OVER (ORDER BY nsn_part_number) AS seqnum 
    FROM 
        dibbs_won dw
    ) dibbs_won
ON 
    dibbs_nobid.seqnum = dibbs_won.seqnum
OR 
    dibbs_lost.seqnum = dibbs_won.seqnum;
© www.soinside.com 2019 - 2024. All rights reserved.