我有表1和表2,它们有相同的列。我想连接表,如果表1中的ID1和ID2(不是"值")与表2匹配,则只包括表1,而不包括表2。如果它们不匹配,则包括。
仅供参考,表2中的所有"值"均为NULL。执行上述步骤后,如果输出表具有值"NULL",并且对于该行,表2具有与表1匹配的ID1,则应用表1中的此值。
这两个步骤可以卷成一个。我已经把它分解出来,以确保它容易理解。
我尝试使用下面的代码,我只是要设法摆脱重复的条目,并做问题的第二部分。我不认为我的方式是非常有效的。希望一些指导...
SELECT ID1, ID2, value
FROM table1
UNION
SELECT ID1, ID2, value
FROM table2
表一:
| 识别码1|识别码2|价值|
| - ------|- ------|- ------|
| 1个|1个|0.1分|
| 1个|第二章|0.2分|
| 第二章|第二章|0.2分|
表二:
| 识别码1|识别码2|价值|
| - ------|- ------|- ------|
| 1个|1个|零|
| 第二章|1个|零|
对于任务#1,这是我想要的输出:
| 识别码1|识别码2|价值|
| - ------|- ------|- ------|
| 1个|1个|0.1分|
| 1个|第二章|0.2分|
| 第二章|第二章|0.2分|
| 第二章|1个|零|
对于任务#2,这是我想要的输出:
| 识别码1|识别码2|价值|
| - ------|- ------|- ------|
| 1个|1个|0.1分|
| 1个|第二章|0.2分|
| 第二章|第二章|0.2分|
| 第二章|1个|0.2分|
2条答案
按热度按时间kqlmhetl1#
正如我在评论中提到的,
FULL OUTER JOIN
可能更适合这里,根据您给出的数据,它可能看起来像这样:vulvrdjw2#
因此,从table 1中提取行并忽略table 2中ID匹配的行。在此答案中,table 1是第一个SELECT,table 2是第二个SELECT。
UNION在学术上是正确的方法,它很有效,而且在几个测试行上速度很快。
然后,表中有数百万/数十亿行,UNION方法突然变慢。UNION在以下情况下变慢:
UNION的工作原理是对照table 2的所有行检查table 1的每一行。这不是真实的的集合操作。
如果UNION进展缓慢,则以下策略会有所帮助:
将UNION替换为UNION ALL,并在两个部分中替换WHERE子句,以确保结果永不重叠。实际上,对table 1使用WHERE子句对table 2使用WHERE NOT子句。
我比较中等大小或更大的数据集的首选方法是除了索引CTE方法/ UNION ALL / WHERE + WHERE NOT之外。简单地说,到目前为止,它对我来说足够快,开销最小。