目录
不可能的连接
不可能的连接方法
STRING_SPLIT()的工作原理
将STRING_SPLIT()与INNER JOIN一起使用
结论
在本文中,我将向您展示如何使用STRING_SPLIT()来连接两个表。
在本文中,我将向您展示如何使用STRING_SPLIT()连接两个表。我称之为不可能的连接。
我已经多次遇到这种情况,并且总是在处理从两个不同来源导入的数据时。在大多数情况下,它与用户输入数据不一致有关。
不可能的连接在此示例中,我有两个表,Project和ProjectStatus。我想连接ProjectStatus到Project以在相同的结果中显示Name、ProjectStatus和AccountNumber。
如果你看ProjectStatus,ProjectName是程序员的梦想。代码看起来很棒。另一方面,Project表一团糟。代码隐藏在列值中。
没有办法直接从一个连接到另一个。事实上,只有Project 9108成功连接。
我们使不可能的连接起作用的方法是将ProjectName分成几部分。这样,我们不必连接“F1432 plastic”,但可以查看连接“F1432”或“plastic”部分。
从示例中可以看出,“F1432”是商品ProjectName的一部分,很容易在两个表之间连接。
主要步骤是:
- 将热混乱的列分成几块。
- 连接这个单独的部分以进行匹配。
- 如果匹配,则将两个表连接在一起。
所以现在我们知道这是如何发生的,让我们让它发生。为此,我们将首先了解STRING_SPLIT()。
STRING_SPLIT()的工作原理STRING_SPLIT()用于将列拆分为单独的部分。它是一种特殊类型的函数,它返回一个表作为其结果。它类似于表值函数。
您可以在我写的这篇文章中了解更多信息STRING_SPLIT(),但总体思路是它采用您要拆分的列和字符,例如分隔值(也称为单词)的空格。
所以STRING_SPLIT(‘F1432 plastic’, ‘ ‘)返回一个有两行的表:
- F1432
- Plastic
在我们的示例中,让我们看看在查询Project中使用字符串拆分时会发生什么:
这是带有帐号的标记化表:
select value ProjectName, AccountNumber
from Project
cross apply string_split(ProjectName, ' ')
这里有几件事需要注意。首先,由于STRING_SPLIT()返回一个表,我们可以在查询中使用它。你会看到我正在使用CROSS APPLY将STRING_SPLIT()结果连接到Project。我这样做可以返回一个结果,显示每个ProjectName值旁边的AccountNumber。
我们现在在最终连接ProjectStatus表中使用这个结果来获得我们的最终结果。
将STRING_SPLIT()与INNER JOIN一起使用至此,困难的部分已经结束。我们有一个中间结果,其中包括项目“代码”以及帐号。
最后要做的是将其与Project表格相关联。
在以下示例中,我将所有这些放在一起:
Select s.ProjectName, s.ProjectStatus, p.AccountNumber
from ProjectStatus s
left join (
select value ProjectName, AccountNumber
from Project cross apply string_split(ProjectName, ' ')
) p on s.ProjectName = p.ProjectName
如果您发现自己需要连接嵌入在另一个字符串中的“代码”,那么您可能会发现STRING_SPLIT()允许您访问“代码”以使连接成功。
本文最初发布于How to do an Impossible Join with String Split - Essential SQL
https://www.codeproject.com/Articles/5326621/How-to-do-an-Impossible-Join-with-String-Split