模式更新搜索Sql

时间:2014-10-24 02:06:18

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

这让我感到困惑,我需要:

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中的每个值至少显示一次或多次。

有没有办法让这更有效?

3 个答案:

答案 0 :(得分: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');

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

这是你想要的吗?

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

作为注释:表之间的比较是使用通配符匹配,这将是缓慢的。虽然全文索引可能会有所帮助,但您无法使用普通索引改进此特定比较。