我有一个产品表,每个产品都有一个类别字段(这不是由我来改变,我需要从中读取数据),从产品表I想要仅使用唯一类别更新类别表(我还使用IFNULL
来处理空类别),这是我到目前为止的工作原理:
string query = "INSERT INTO categories (name)
SELECT DISTINCT(IFNULL(category, \"Uncategorized\")) AS category_name
FROM products
WHERE NOT EXISTS (
SELECT name FROM categories
WHERE name = category_name)";
通过上面的查询,我可以使用唯一的类别字段更新类别,每次我需要运行它时,它只会添加表中不存在的类别。
但除了以上内容之外,我还需要包含一个配置文件ID,每个类别都插入这样的东西,这不起作用:
string query = "INSERT INTO categories (profile_id, name)
SELECT " + profileId.ToString() + ",
DISTINCT(IFNULL(category, \"Uncategorized\")) AS category_name
FROM products
WHERE NOT EXISTS (
SELECT name FROM categories
WHERE name = category_name
AND profile_id = @profileId)";
有没有办法用查询来表达这个?
上面给了我一条消息:
SQLite error near "DISTINCT": syntax error
SqliteMan错误:
Query Error: near "DISTINCT": syntax error Unable to execute statement
如果我不清楚我应该知道什么,请告诉我。
答案 0 :(得分:1)
您错误地使用了DISTINCT
关键字:它不是函数。请尝试改为:
"INSERT INTO categories (profile_id, name)
SELECT DISTINCT '"+profileId.ToString()+"', IFNULL(category, 'Uncategorized')
FROM products
WHERE category_name NOT IN (
SELECT name FROM categories WHERE profile_id = "'+profileId.ToString()+"'
)
"
有人假设profileId.ToString()
可以保证不会出现SQL注入,或者你会将它作为参数传递给预准备语句吗?