加入不同的 PostgreSQL

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

我有两张桌子。两者都包含列

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);
postgresql join distinct
1个回答
0
投票

一种选择是使用每个表上的行号,通过

  • 对“id_”进行分区;
  • 通过“order”订购。

最终根据 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

查看演示这里

© www.soinside.com 2019 - 2024. All rights reserved.