作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有两个表:
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.id
或 b.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
注意 union
与 union all
Union 做一个不同的,它会删除重复项,而使用 union all
关于MySQL 联合成新专栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836624/
我是一名优秀的程序员,十分优秀!