使用UPDATE,SET,WHERE和LIKE的Sqlite语句不会更新所有记录

时间:2013-10-08 23:00:45

标签: sql sqlite

我在sql gui工具'SQLite Database Browser 2.0 b1'中使用'Execute SQL'功能。'

我不确定我遇到的问题是因为浏览器中的错误还是我的SQL错误。我知道我在浏览器工具中发现了几个错误。

总之。这是我目前正在处理的问题......

我在数据库中有两个表:

TOYS
------------------------------
TOY_ID   TOY_DESC
------------------------------
1         Green truck, plastic
2         Doll, plastic, wood
3         Stuffed cloth animal
4         Board game cardboard and plastic
etc .....

MATERIALS
-----------------------------
TOY_ID     PLASTIC
-----------------------------
1
2
3
4
etc ......

我正在尝试更新MATERIALS表,以便如果与TOYS表中匹配的TOY_ID相对应的TOY_DESC包含单词'plastic',它应该将数字1插入到MATERIALS表的PLASTIC列中。这就是我的尝试:

UPDATE MATERIALS SET PLASTIC = 1 WHERE TOY_ID = (SELECT TOY_ID FROM TOYS WHERE TOY_DESC LIKE '%plastic%');

当我尝试这个时它没有做任何事。

然后我试了......

UPDATE MATERIALS SET PLASTIC = 1 WHERE TOY_ID = (SELECT TOY_ID FROM TOYS WHERE TOY_DESC LIKE "%plastic%");

然后给了我:

MATERIALS
-----------------------------
TOY_ID     PLASTIC
-----------------------------
 1          1
 2
 3
 4
 etc ......
然后我试了......

UPDATE MATERIALS SET PLASTIC = 1 WHERE TOY_ID = (SELECT TOY_ID FROM TOYS WHERE TOY_DESC LIKE '%plastic,%');

并且只更新了另外一条记录:

MATERIALS
-----------------------------
TOY_ID     PLASTIC
-----------------------------
1            1
2            1
3
4
etc ......

但是,它仍然没有更新描述中包含塑料一词的所有记录!!我不明白。为什么不是所有记录都在更新?我能理解在单词的末尾是否有其他类型的符号或字符,但没有。它就像其他描述中完全相同的单词,它们都被跳过了! 我更加困惑的是,为什么更新在所有情况下都不起作用,直到我用双引号替换单引号。这是因为数据库类型不同(sqlite与mysql)?

编辑**:

我尝试了下面海报中的建议,将其进一步分解,看看问题可能出在哪里。当我这样做时:

SELECT TOY_ID FROM TOYS WHERE TOY_DESC LIKE '%plastic%'

我成功获得了描述中包含单词plastic的所有记录的列表。所以LIKE语句不是问题。现在的问题是如何将这些内容反映在MATERIALS表中?

我猜我每次比赛都需要一个循环?

1 个答案:

答案 0 :(得分:1)

通过分解查询的组件来解决您的查询问题。首先运行嵌套/子查询:

SELECT TOY_ID FROM TOYS WHERE TOY_DESC LIKE "%plastic%"

它能为您提供您期望的结果吗?

现在你可以专注于类似的表达。我不是sqllite专家,但看起来好像%like%需要两边的字符。所以你可以这样做:

SELECT TOY_ID FROM TOYS 
WHERE 
     TOY_DESC LIKE "%plastic%" 
  OR TOY_DESC LIKE "plastic%" 
  OR TOY_DESC LIKE "%plastic"

此处还有其他一些可能性:SQLite query, 'LIKE'

更新:太好了,现在你知道你正在获得预期的ID而不必再乱用那个子查询了。现在尝试代替WHERE TOY_ID = (使用WHERE TOY_ID in (