INSERT与SELECT DISTINCT和另一个字段包括?

时间:2012-08-04 23:19:11

标签: c# .net-4.0 sqlite

我有一个产品表,每个产品都有一个类别字段(这不是由我来改变,我需要从中读取数据),从产品表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

如果我不清楚我应该知道什么,请告诉我。

1 个答案:

答案 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注入,或者你会将它作为参数传递给预准备语句吗?