我正在使用SQL Server 2008.我这里有2个表。
shades_table color_name category location Aqua Blue House A Denim Blue House B Azure Blue House B Zaffre Blue House A Scarlet Red House C Ruby Red House D Chili Red House D Crimson Red House A objects_table object_name color_cat location2 Super Aqua shoes Null Null Azure wallet Null Null Awesome Scarlet chair Null Null Ruby socks Null Null Sparkly Denim chalk Null Null Chili paper Null Null Zaffre vase Null Null Sharp Crimson eraser Null Null Crimson watch Null Null Excellent Scarlet bucket Null
我有一个名为shades_table的引用表。列包含color_name,另一列包含颜色类别。
我正在研究objects_table。 object_name列包含颜色名称。我希望一个过程/程序自动将color_names与Object_name匹配,然后更新color_cat列中的Null值。
我目前的方法是将shades_table导出到csv文件。然后我写了一个Java程序,它读取csv文件,并输出到sql文件,由服务器运行:
UPDATE objects_table SET color_cat='Blue', location2 = 'House A' WHERE object_name LIKE '%Aqua%' AND color_cat IS NULL UPDATE objects_table SET color_cat='Blue', location2 = 'House B' WHERE object_name LIKE '%Denim%' AND color_cat IS NULL UPDATE objects_table SET color_cat='Blue', location2 = 'House B' WHERE object_name LIKE '%Azure%' AND color_cat IS NULL etc...
这种方法有效,但它很愚蠢。 我只是不知道如何编写可以做我想做的SQL语句。
更新: 我添加了一个我想要匹配的额外列。(请参阅我的Java程序输出)。使用2 SET的UPDATE语句不起作用。 例子
update o set o.color_cat = s.category, set o.location2 = s.location ...
不起作用, 在关键字'set'附近给出“语法错误。
答案 0 :(得分:0)
这是更新查询。
UPDATE a
SET a.color_cat=b.category
FROM objects_table a
JOIN shades_table b ON a.[object_name] LIKE '%'+b.[color_name]+'%'
WHERE a.color_cat IS null
如果您想将其作为程序
CREATE PROCEDURE Updateobjectstable
AS
BEGIN
UPDATE a
SET a.color_cat=b.category
FROM objects_table a
JOIN shades_table b ON a.[object_name] LIKE '%'+b.[color_name]+'%'
WHERE a.color_cat IS null
END
答案 1 :(得分:0)
我没有看到使用程序执行此任务的理由。纯SQL应该工作。
UPDATE objects_table ot
SET color_cat = st.category
FROM shades_table st
WHERE ot.object_name ILIKE concat('%', st.color_name, '%')
AND ot.color_cat IS NULL
答案 2 :(得分:0)
简单update
语句会为您做到这一点:
update o
set o.color_cat = s.category
from objects_table o
left join shades_table s
on(o.[object_name] like '%' + s.color_name + '%')