我知道这是一个奇怪的请求,但我所在的公司有一个为 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;
为了可重复性,请考虑在此类问题中包含对象和数据创建脚本。
假设以下脚本复制您的场景:
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;