基于外键的子字符串连接两个表(MS SQL 2005)

时间:2014-04-17 09:22:28

标签: mysql sql sql-server

我被困在加入两张桌子" 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 +" " +儿童SKU。所以表中的每个sku都有一个孩子sku。父母的孩子被" "。

分开

我想在" _"之后加入A.SKU表。在表B.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))

在此背景下,您的帮助将受到高度赞赏。

6 个答案:

答案 0 :(得分:4)

你发现的问题是因为_下划线字符在模式字符串中有意义,就像百分之百字符一样。

你需要在这篇文章中引用它来逃避它 How to escape underscore character in PATINDEX pattern argument?

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以加入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)上创建计算列,并在其上创建索引,那就更好。

答案 3 :(得分:0)

我会重新考虑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

这样做的原因:

答案 4 :(得分:0)

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

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

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

编辑 - 这是针对MySQL的,这个问题用

标记

答案 5 :(得分:0)

不会有这样的工作吗?

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