【问题标题】:Joining two tables based on substring from foreign keys (MS SQL2005)根据外键的子字符串连接两个表(MS SQL2005)
【发布时间】:2014-04-17 09:22:28
【问题描述】:

我被困在加入两个表“a”和“b”。这两个表的结构如下所示。

表 A

+-------------+---------------------+
+ SKU         |     Title           +
+-------------+---------------------+
+ 12345_786   |  Some text          +
+             |                     +
+ 12345_231   |  Sony               +
+             |                     +
+ 12345_222   |  Samsung            +
+             |                     +
+ 67481_21    |  IBM                +
+             |                     +
+ 88723_231   |  HP                 +
+-------------+---------------------+

表 B

+-------+---------------------+
+ SKU   |     Price           +
+-------+---------------------+
+ 786   |  $230               +
+       |                     +
+ 231   |  $540               +
+       |                     +
+ 222   |  $120               +
+       |                     +
+ 21    |  $220               +
+       |                     +
+ 231   |  $50                +
+-------+---------------------+

表 SKU 约定是 ParentSKU + "" + Child SKU。所以表中的每个 sku 都有一个子 sku。父子被“”隔开。

我想在表 B.SKU 上的“_”之后加入表 A.SKU 部分

到目前为止,我已经尝试了以下查询,但没有得到想要的结果。

SELECT A.SKU,B.Price
FROM A
INNER JOIN
B ON 
Substring(A.SKU, patindex('%_%', A.SKU), 
Cast(Len(A.SKU) as int)-cast(patindex('%_%',A.SKU)as int)) 
= CAST(B.SKU AS varchar(12))

我们将非常感谢您在这方面的帮助。

【问题讨论】:

  • 你使用的是mysql还是sql-server?
  • 抱歉没有提到问题。我正在使用 MS-SQL2005
  • @Mehboob 我认为这在不使用substring 的情况下也是可行的,但在加入表格时使用LIKE

标签: mysql sql sql-server


【解决方案1】:

您发现的问题是因为 _ 下划线字符在模式字符串中具有含义,很像 % 百分比字符。

您需要按照本文中的说明对其进行转义 How to escape underscore character in PATINDEX pattern argument?

【讨论】:

  • 非常感谢。主要问题是下划线在使用模式时有意义。
  • (+1) 很好的答案 欢迎来到stackoverflow
【解决方案2】:

我会在表上创建一个新列,其值在“_”之后,然后使用它来加入或创建一个索引视图。该视图将创建新列。

然后,您的选择查询可以加入这个新列(来自表或视图),而无需进行任何额外的字符串操作。如果您随后在此新列上设置了索引,这也可能会阻止搜索参数,从而保持您的查询执行性能。

【讨论】:

  • 我正在为我的一位客户工作,无法更改数据库结构。
【解决方案3】:

你可以加入SUBSTRING,但是效果不是很好,因为你不能索引它:

select *
from #t1
inner join #t2
on substring(#t1.sku, charindex('_', #t1.sku)+1, 3) = #t2.sku

如果您可以在substring(#t1.sku, charindex('_', #t1.sku)+1, 3) 上创建一个计算列,并在其上创建一个索引,那就更好了。

【讨论】:

    【解决方案4】:

    我会重新考虑 TableA 的设计:

    • 添加新列 SKU1(值为 12345、67481 等)
    • 添加新列 SKU2(值为 786、231 等)
    • 将 SKU 列重新创建为 computed(最终持久化)列为 SKU1 + '_' + SKU2。

    另外,我会考虑对 TableA.SKU2 和 TableB.SKU 列使用相同的数据类型。

    然后简单地重写您的查询:

    SELECT A.SKU,B.Price
    FROM
        TableA A
        INNER JOIN TableB B ON A.SKU2 = B.SKU
    

    这样做的原因:

    【讨论】:

      【解决方案5】:

      这样的东西不行吗?

      select a.sku, b.price
      from a 
      inner join b
      on a.sku LIKE '%_' + b.sku
      

      【讨论】:

        【解决方案6】:

        mondayUK 的回复解释了您遇到的问题。

        如果您只是想要一个不需要更改表格以获得所需结果的解决方案,那么可能是这样的:-

        SELECT A.SKU,B.Price
        FROM A
        INNER JOIN B 
        ON CAST(SUBSTRING_INDEX(A.SKU, '_', -1) AS UNSIGNED) = B.SKU
        

        编辑 - 这是 MySQL,这个问题被标记

        【讨论】:

          猜你喜欢
          • 2015-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多