Column Aliasing raised error: no such column
Column Aliasing raised error: no such column
此查询在 Mysql 中正常运行:
SELECT category AS category_name, COUNT(id) AS total_books,
(SELECT COUNT(language) FROM books WHERE language = 'lang1' AND category = category_name) AS lang1,
(SELECT COUNT(language) FROM books WHERE language = 'lang2' AND category = category_name) AS lang2,
(SELECT COUNT(language) FROM books WHERE language = 'lang3' AND category = category_name) AS lang3
FROM books GROUP BY category
但在 SQLite 中出现错误:room [SQLITE_ERROR] SQL 错误或缺少数据库(没有这样的列:category_name )
为什么会这样?对于此查询,SQLite 是否需要与 Mysql 不同的方法?
MySQL 在允许使用别名方面似乎更加宽松。您可以尝试使用更明确的别名重写查询,如下所示:
SELECT
category AS category_name,
COUNT(id) AS total_books,
(SELECT COUNT(language) FROM books b2
WHERE language = 'lang1' AND b2.category = b1.category) AS lang1,
(SELECT COUNT(language) FROM books b2
WHERE language = 'lang2' AND b2.category = b1.category) AS lang2,
(SELECT COUNT(language) FROM books b2
WHERE language = 'lang3' AND b2.category = b1.category) AS lang3
FROM books b1
GROUP BY category;
但更好的写法可能是用条件聚合替换相关子查询:
SELECT
category AS category_name,
COUNT(id) AS total_books,
COUNT(CASE WHEN language = 'lang1' THEN 1 END) AS lang1,
COUNT(CASE WHEN language = 'lang2' THEN 1 END) AS lang2,
COUNT(CASE WHEN language = 'lang3' THEN 1 END) AS lang3
FROM books
GROUP BY category;
此查询在 Mysql 中正常运行:
SELECT category AS category_name, COUNT(id) AS total_books,
(SELECT COUNT(language) FROM books WHERE language = 'lang1' AND category = category_name) AS lang1,
(SELECT COUNT(language) FROM books WHERE language = 'lang2' AND category = category_name) AS lang2,
(SELECT COUNT(language) FROM books WHERE language = 'lang3' AND category = category_name) AS lang3
FROM books GROUP BY category
但在 SQLite 中出现错误:room [SQLITE_ERROR] SQL 错误或缺少数据库(没有这样的列:category_name )
为什么会这样?对于此查询,SQLite 是否需要与 Mysql 不同的方法?
MySQL 在允许使用别名方面似乎更加宽松。您可以尝试使用更明确的别名重写查询,如下所示:
SELECT
category AS category_name,
COUNT(id) AS total_books,
(SELECT COUNT(language) FROM books b2
WHERE language = 'lang1' AND b2.category = b1.category) AS lang1,
(SELECT COUNT(language) FROM books b2
WHERE language = 'lang2' AND b2.category = b1.category) AS lang2,
(SELECT COUNT(language) FROM books b2
WHERE language = 'lang3' AND b2.category = b1.category) AS lang3
FROM books b1
GROUP BY category;
但更好的写法可能是用条件聚合替换相关子查询:
SELECT
category AS category_name,
COUNT(id) AS total_books,
COUNT(CASE WHEN language = 'lang1' THEN 1 END) AS lang1,
COUNT(CASE WHEN language = 'lang2' THEN 1 END) AS lang2,
COUNT(CASE WHEN language = 'lang3' THEN 1 END) AS lang3
FROM books
GROUP BY category;