1

我有一个产品表,每个产品都有一个类别字段(这不是我要更改的,我需要从中读取数据),我想从产品表中更新一个仅包含唯一类别的类别表(我也使用 aIFNULL来处理空类别),这是我目前所拥有的:

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

让我知道我是否还不清楚,我应该更清楚什么。

4

1 回答 1

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 注入的影响,否则您会转义它/将其作为参数传递给准备好的语句?

于 2012-08-04T23:24:08.283 回答