【问题标题】:Joining 2 sql tables based on substring基于子字符串连接2个sql表
【发布时间】:2016-04-11 19:29:03
【问题描述】:

我正在尝试加入只有两个匹配键是 table1.Accounttable2.key 的表

但问题在于设置。 table1.Account字段有10位,只有中间4或5位与table2.key匹配

eg : 1234xxxx10 - > table1.Account matches with xxxx -> table2.key

or   123xxxxx10 - > table1.Account matches with xxxxx -> table2.key

我已经编写了这段 INNER JOIN 代码,但是查询一直在运行并且没有返回任何内容。

SELECT DISTINCT column1, column2
from table1 INNER JOIN table2 ON table1.Account like '%'+table2.key+'%'
order by column1

【问题讨论】:

  • 如果您删除distinct,您应该可以更快地获得一些结果。还有,你怎么知道中间的 4 还是 5 匹配?
  • 也许使用 left() 会比 like 更快
  • 所以你必须处理一个非常糟糕的数据库设计。您最好的选择是更改它,以便单独的信息位于单独的列中。但是,如果您必须单独使用查询来解决此问题,则必须首先声明查找相关子字符串所依据的规则。它总是字符串中最后两个字符之前的四个或五个字符吗?如果一条记录同时匹配四个字符和另外五个字符怎么办?构成该规则,然后才考虑如何编写查询。

标签: sql sql-server join inner-join


【解决方案1】:

SQL 有一个子字符串函数:

https://msdn.microsoft.com/en-us/library/ms187748.aspx

SELECT DISTINCT column1, column2
from table1 
INNER JOIN table2 
    ON table1.Account = substring(table2.key, 3, 4)
    OR table1.Account = substring(table2.key, 4, 4)
order by column1

我不知道您的 on 子句中是否需要“或”,但根据您的问题,这些字段可能有两种匹配方式。无论如何,您可以根据需要修改 on 子句,但此示例应该可以帮助您处理语法,这似乎是您的障碍。

【讨论】:

  • 我无法想象它的性能与原始查询的性能有何不同。
  • 好吧,因为他使用like和通配符来比较一个4或5个字符的字段和一个10个字符的字段,他需要为每个尝试的连接进行7次比较,而我的只进行1或2次,具体取决于关于他是否需要 on 子句的第二部分。
  • 例如 table1.Account = 'ABCDEFGHIJ' 和 table2.Key = 'DEFG', substring(table1.Account, 4, 4) = table2.key 进行 1 次比较,而 table2.key 像'%' + table1.ACcount + '%' 可以进行 7 次比较。
  • (1) LIKE 是内置的,因此非常高效; (2) substring() 可能更快; (3) 这无关紧要,因为这不是查询缓慢的原因。嵌套循环连接后跟 distinct 解释了为什么它很慢,而不是字符串比较。
  • distinct 显然会使查询变慢,但如果这是他需要的,我不知道另一种获取不同值的方法,除了返回所有内容并让应用程序循环遍历结果,这我认为这是糟糕的设计。也就是说,嵌套循环连接是什么意思,它们如何应用在这里,你会用什么逻辑替换它们?
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 2018-12-08
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多