mysql - 如何在 MySQL 中执行 "horizontal UNION"? (连接表格)

标签 mysql sql

我正在寻找连接或合并两个(或更多)表的可能性。我无法加入所有表,因为没有引用和没有匹配的列。如果我在没有任何“ON”的情况下加入,我将得到表 1 中的所有数据乘以表 2 中的所有数据(不是我想要的)。所以我试图用 MySQL 用户定义的变量提供假的 rownums,但由于所有表中的数据量不同,我无法比较它们。这有点难以解释。因此,我将提供一些示例。

示例 1(表 1 = 4 行,表 2 = 3 行,结果 = 4 行)

+---------+---------+---------------+
| Table 1 | Table 2 | Result        |
+---------+---------+-------+-------+
| Col 1   | Col 1   | Col 1 | Col 2 |
+---------+---------+-------+-------+
| A       | H       | A     | H     |
| B       | I       | B     | I     |
| C       | J       | C     | J     |
| D       |         | D     | NULL  |
+---------+---------+-------+-------+

示例 2(表 1 = 3 行,表 2 = 4 行,结果 = 4 行)

+---------+---------+---------------+
| Table 1 | Table 2 | Result        |
+---------+---------+-------+-------+
| Col 1   | Col 1   | Col 1 | Col 2 |
+---------+---------+-------+-------+
| A       | H       | A     | H     |
| B       | I       | B     | I     |
| C       | J       | C     | J     |
|         | K       | NULL  | K     |
+---------+---------+-------+-------+

示例 3(表 1 = 3 行,表 2 = 4 行,表 3 = 2 行,结果 = 4 行)

+---------+---------+---------+-----------------------+
| Table 1 | Table 2 | Table 3 | Result                |
+---------+---------+---------+-------+-------+-------+
| Col 1   | Col 1   | Col 1   | Col 1 | Col 2 | Col 3 |
+---------+---------+---------+-------+-------+-------+
| A       | H       | O       | A     | H     | O     |
| B       | I       | P       | B     | I     | P     |
| C       | J       |         | C     | J     | NULL  |
|         | K       |         | NULL  | K     | NULL  |
+---------+---------+---------+-------+-------+-------+

现在是真正困难的部分。我需要这个作为查询。我不想填充其他临时表。如果可能:-)

最佳答案

我认为您是在按“Col 1”值简单排序的每个表的密集序数排名中加入?

这实际上是按每个表的等级进行的完全外部联接。

不幸的是,MySQL 不支持 ROW_NUMBER() 分析函数,这将使这个相对简单:

SELECT *
FROM (SELECT "Col 1", ROW_NUMBER() (OVER ORDER BY "Col 1") AS RowNum FROM "Table 1") AS T1
FULL OUTER JOIN (SELECT "Col 1", ROW_NUMBER() (OVER ORDER BY "Col 1") AS RowNum FROM "Table 2") AS T2
    ON T2.RowNum = T1.RowNum
FULL OUTER JOIN (SELECT "Col 1", ROW_NUMBER() (OVER ORDER BY "Col 1") AS RowNum FROM "Table 3") AS T3
    ON T3.RowNum = T2.RowNum
ORDER BY COALESCE(T1.RowNum, T2.RowNum, T3.RowNum)

MySQL 中有替代方案,但我不熟悉解决方法。

就 FULL OUTER JOIN 解决方法而言,排名很容易,因为已知排名只是自然数:

SELECT *
FROM Numbers
LEFT JOIN (SELECT "Col 1", ROW_NUMBER() (OVER ORDER BY "Col 1") AS RowNum FROM "Table 1") AS T1
    ON T1.RowNum = Numbers.Number
LEFT JOIN (SELECT "Col 1", ROW_NUMBER() (OVER ORDER BY "Col 1") AS RowNum FROM "Table 2") AS T2
    ON T2.RowNum = Numbers.Number
LEFT JOIN (SELECT "Col 1", ROW_NUMBER() (OVER ORDER BY "Col 1") AS RowNum FROM "Table 3") AS T3
    ON T2.RowNum = Numbers.Number
WHERE COALESCE(T1.RowNum, T2.RowNum, T3.RowNum) IS NOT NULL
ORDER BY Numbers.Number

关于mysql - 如何在 MySQL 中执行 "horizontal UNION"? (连接表格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5473837/

相关文章:

mysql - 更改表信息

php - mysqli::mysqli(): (HY000/2002) 本地主机不工作

php - 从一个数组中的sql中获取数据

c# - 检查是否存在重复条件

mysql - 减去特定列的值,其中特定列的值在两个表中相同

java - SQLite 查询在 Java 中非常慢

php - 该帖子的固定链接不起作用

mysql - H2 DB 的 UNIX_TIMESTAMP 函数等效吗?

php - MYSQL拉取自增值

Mysql:更新最新记录的字段