【问题标题】:Pattern Update Search Sql模式更新搜索 Sql
【发布时间】:2014-10-24 02:06:17
【问题描述】:

这让我很难过,我需要:

UPDATE items

SET items.Categories = category.Categories --fyi this is pk

WHERE items.Description is like pattern from category.Description

我已经尝试了各种方法来做到这一点。也许我看错了;但是,我在这个上旋转我的轮子。

我发现这行得通:

UPDATE  ITEMS
SET  categories = C.Categories
FROM  ITEMS I, CATEGORY C
WHERE  I.description LIKE '%' + substring(C.description,1,6) + '%';

产量(受影响的 933 行)并且 c.Categories 中的每个值至少显示一次或多次。

有没有办法让这更有效?

【问题讨论】:

  • 在这种情况下pattern 是什么?

标签: sql sql-server-2008 sql-update


【解决方案1】:

UPDATE会是这样的

UPDATE ITEMS
set categories = C.Categories
FROM ITEMS I
JOIN CATEGORY C
ON I.description LIKE '%' + C.description + '%' ;

假设你有这样的数据集,XYZ 将在 ITEM 表中更新为 APPLE

INSERT INTO ITEMS
VALUES ('XYZ','APPLE is good and healthy');
INSERT INTO CATEGORY
VALUES ('APPLE','APPLE is good');

【讨论】:

  • 但是,如果表的描述字段之间存在一对多关系,这将引发错误。正如 OP 所说,他正在更新的字段是主键。请在此处找到 SQL 小提琴。sqlfiddle.com/#!6/80e2e/1
  • 这会产生(243 行受影响);但是,有超过 10,000 行,所以我需要一些更有效的东西。无论如何使用 patindex() 或 substring() 来限制 C.description
  • @Straughnhold,一些示例数据和预期输出会有所帮助,可以使用 patindex,但如果您有一些复杂的要求,那么最好使用 CLR 函数。
【解决方案2】:

在运行更新时,您还必须确保 UPDATE 语句不会由于表的“描述”字段之间的一对多关系而产生重复。为此,您可以检查一对多关系是否存在或完全删除主键。

请在下面找到检查一对多关系然后运行更新的代码:

IF NOT EXISTS (SELECT A.Categories, COUNT(1) 
              FROM items A 
              INNER JOIN Category B 
                ON A.Description LIKE '%' + B.Description + '%'
              GROUP BY A.Categories
              HAVING COUNT(1) > 1
              )
UPDATE ITEMS
set categories = C.Categories
FROM ITEMS I
INNER JOIN CATEGORY C
ON I.description LIKE '%' + C.description + '%' ;

也可以在这里找到关于 SQL Fiddle 的解决方案:http://sqlfiddle.com/#!6/80e2e/12

【讨论】:

  • @RADAR 这会产生(0 行受影响)
  • @Straughnhold 是的,如果表之间存在一对多关系。请阅读我在代码上方的解释。
【解决方案3】:

这是你想要的吗?

UPDATE items
    SET Categories = c.Categories --fyi this is pk
    FROM items i JOIN
         Category c
         ON i.Description like '%' + category.Description + '%';

注意:表之间的比较使用通配符匹配,这会很慢。尽管全文索引可能会有所帮助,但您无法改进与普通索引的特定比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多