我正在寻找连接或联合两个(或更多)表的可能性.我无法加入所有表,因为没有引用没有匹配的列.如果我在没有任何"开启"的情况下加入,我将从表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 |
+---------+---------+-------+-------+
Run Code Online (Sandbox Code Playgroud)
例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 |
+---------+---------+-------+-------+
Run Code Online (Sandbox Code Playgroud)
例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 |
+---------+---------+---------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)
现在是真正的困难部分.我需要这个作为查询.我不想填写其他临时表.如果可能的话 :-)
我认为你加入了每个表的密集顺序等级,只是按"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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)