我被困在加入两张桌子" 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))
在此背景下,您的帮助将受到高度赞赏。
答案 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的设计:
另外,我会考虑对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