gpt4 book ai didi

MySQL 联合成新专栏

转载 作者:行者123 更新时间:2023-11-29 01:15:53 26 4
gpt4 key购买 nike

假设我有两个表:

table_A    table_B
+----+ +----+
| id | | id |
+----+ +----+
| 1 | | 3 |
| 2 | | 4 |
+----+ +----+

我想要的是表的 UNION,但将 table_B 中的记录作为单独的列,而不是额外的行。行之间不需要任何关联,例如在 JOIN 的情况下。

示例结果集如下所示:

+------+------+
| a.id | b.id |
+------+------+
| 1 | 3 |
| 2 | 4 |
+------+------+

我可以接近

SELECT a.id, b.id FROM 
(SELECT id, 'nothing' from table_A) a JOIN
(SELECT id, 'nothing' from table_B) b ON a.nothing = b.nothing

但这会创建所需行数的两倍:

+------+------+
| a.id | b.id |
+------+------+
| 1 | 3 |
| 2 | 3 |
| 1 | 4 |
| 2 | 4 |
+------+------+

a.idb.id 上的 GROUP BY 丢失了未分组列中的值之一。

每个表的大小可以不同。如果一个表比另一个表大,NULL 值应放在较短的列中。

最佳答案

非平凡的&

现在测试:SQL FIDDLE现在已更新以处理包含两个表中所有记录的要求。 SQL Fiddle

我会使用用户变量为每个表中的每一行分配一个特定的行号,然后加入用户变量。加入伪列值“nothing”不起作用的原因是,如您所见,它对另一个表中的每个值使用一次 EACH ID,​​因此当您需要 1:1 时会产生 1:M。通过分配行号,我们保证每一行只使用一次;因此是 1:1 的关系。

这假设如果两个表的行数不相等,则具有更多记录的表将被截断以消除较高的行号是可以接受的。

如果需要,您可以使用外部(左、右)联接,以便显示具有更多 ID 的表的所有记录,但您必须首先知道哪个表具有更多 ID。

SELECT C.ID, D.ID
FROM (SELECT id, @row:=@row+1 RN
FROM table_A
CROSS JOIN (select @row:=0) a
ORDER BY ID) C
INNER JOIN (SELECT id, @row2:=@row2+1 RN
FROM table_B
CROSS JOIN (select @row2:=0) b
ORDER BY ID) D
on C.RN = D.RN

我还应用了一个顺序,以便每个表的较低 ID 对齐。

现在如果你不知道哪个表会有更多记录...

您可以使用以下命令在 MYSQL 中模拟完全外部连接...

SELECT C.ID, D.ID
FROM (SELECT id, @row:=@row+1 RN
FROM table_A
CROSS JOIN (select @row:=0) a
ORDER BY ID) C
LEFT JOIN (SELECT id, @row2:=@row2+1 RN
FROM table_B
CROSS JOIN (select @row2:=0) b
ORDER BY ID) D
on C.RN = D.RN

UNION

SELECT C.ID, D.ID
FROM (SELECT id, @row:=@row+1 RN
FROM table_A
CROSS JOIN (select @row:=0) a
ORDER BY ID) C
RIGHT JOIN (SELECT id, @row2:=@row2+1 RN
FROM table_B
CROSS JOIN (select @row2:=0) b
ORDER BY ID) D
on C.RN = D.RN

注意 unionunion all

Union 做一个不同的,它会删除重复项,而使用 union all

时不会出现重复项

关于MySQL 联合成新专栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com