我有两张桌子。两者都包含列
order_
(整数)、id_
(UUID)和 text_
(文本)。对于同一 id_,tobe
表具有正确的 order_ 值,而 asis
表具有不正确的 order_
值。
INSERT INTO tobe (order_,id_,text_) VALUES
(10,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(11,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(12,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(13,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(14,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(15,'22b48906-4d7f-4d22-a027-101d0a96b970','');
INSERT INTO asis (order_,id_,text_) VALUES
(7,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(8,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(9,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(10,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(11,'22b48906-4d7f-4d22-a027-101d0a96b970',''),
(12,'22b48906-4d7f-4d22-a027-101d0a96b970','');
我需要从
tobe
表获取具有正确 order_ 的表,从 asis
表 = 6 行获取 id_、text_ 和错误 order_ 的表。
如果我通过 id_ 加入它,我会得到 36 行,每个订单 6 行
但是我需要这样的东西
(order_tobe, id_, text_, order_asis)
(10,'22b48906-4d7f-4d22-a027-101d0a96b970','', 7),
(11,'22b48906-4d7f-4d22-a027-101d0a96b970','', 8),
(12,'22b48906-4d7f-4d22-a027-101d0a96b970','', 9),
(13,'22b48906-4d7f-4d22-a027-101d0a96b970','', 10),
(14,'22b48906-4d7f-4d22-a027-101d0a96b970','', 11),
(15,'22b48906-4d7f-4d22-a027-101d0a96b970','', 12);
一种选择是使用每个表上的行号,通过
最终根据 id 和相应的行号值连接两个表。
WITH ord_tobe AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY id_ ORDER BY order_) AS rn
FROM tobe
), ord_asis AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY id_ ORDER BY order_) AS rn
FROM asis
)
SELECT ord_tobe.order_ AS order_tobe,
ord_tobe.id_ AS id_,
ord_tobe.text_ AS text_,
ord_asis.order_ AS order_asis
FROM ord_tobe
INNER JOIN ord_asis
ON ord_tobe.id_ = ord_asis.id_
AND ord_tobe.rn = ord_asis.rn
您使用
INNER JOIN
的前提是假设两个表中的记录数量相同。如果情况并非如此,并且您事先知道两个表中哪一个拥有最多记录,则可以将其放在 FROM
子句中并使用 LEFT JOIN
代替。如果您根本不知道哪个表应该包含最多记录,则需要制作一个外连接,这需要一些工作,因为它没有在 PostgreSQL 中实现。
输出:
order_tobe | id_ | 文字_ | 订单_asis |
---|---|---|---|
10 | 22b48906-4d7f-4d22-a027-101d0a96b970 | '' | 7 |
11 | 22b48906-4d7f-4d22-a027-101d0a96b970 | '' | 8 |
12 | 22b48906-4d7f-4d22-a027-101d0a96b970 | '' | 9 |
13 | 22b48906-4d7f-4d22-a027-101d0a96b970 | '' | 10 |
14 | 22b48906-4d7f-4d22-a027-101d0a96b970 | '' | 11 |
15 | 22b48906-4d7f-4d22-a027-101d0a96b970 | '' | 12 |
查看演示这里。