我正在寻找连接或合并两个(或更多)表的可能性。我无法加入所有表,因为没有引用和没有匹配的列。如果我在没有任何“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/