SQL Server 尝试连接两个表的SQL代码

ktecyv1j  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(126)

我有表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分|

kqlmhetl

kqlmhetl1#

正如我在评论中提到的,FULL OUTER JOIN可能更适合这里,根据您给出的数据,它可能看起来像这样:

SELECT ISNULL(T1.ID1,T2.ID1) AS ID1,
       ISNULL(T1.ID2,T2.ID2) AS ID2,
       ISNULL(T1.Value,T2.Value) AS Value
FROM dbo.Table1 T1
     FULL OUTER JOIN dbo.Table2 T2 ON T1.ID1 = T2.ID1
                                  AND T1.ID2 = T2.ID2;
vulvrdjw

vulvrdjw2#

因此,从table 1中提取行并忽略table 2中ID匹配的行。在此答案中,table 1是第一个SELECT,table 2是第二个SELECT。
UNION在学术上是正确的方法,它很有效,而且在几个测试行上速度很快。
然后,表中有数百万/数十亿行,UNION方法突然变慢。UNION在以下情况下变慢:

  • 行数超过服务器内存可以处理的行数
  • 索引太宽或包含太多
  • 表格/选择范围广
  • 一个源通过网络

UNION的工作原理是对照table 2的所有行检查table 1的每一行。这不是真实的的集合操作。
如果UNION进展缓慢,则以下策略会有所帮助:

  • 检查查询计划(或使用SQL Sentry Explorer等工具)
  • 首先在两个表之间建立索引查找(CTE或物化)
  • 真标引
  • 使用本地表而不是网络数据
  • 将table 2拆分为多个块

将UNION替换为UNION ALL,并在两个部分中替换WHERE子句,以确保结果永不重叠。实际上,对table 1使用WHERE子句对table 2使用WHERE NOT子句。
我比较中等大小或更大的数据集的首选方法是除了索引CTE方法/ UNION ALL / WHERE + WHERE NOT之外。简单地说,到目前为止,它对我来说足够快,开销最小。

相关问题