优化两个COUNT / DISTINCT查询

时间:2011-10-01 09:30:02

标签: sql sqlite

我有一个包含column1和column2的表(它们都包含TEXT)。我想得到:

1)column1 @ table的唯一行数,不区分大小写

2)column1 @ table和column2 @ table的唯一行数,不区分大小写

SELECT count(*) AS unique_row1 FROM (SELECT DISTINCT lower(column1) FROM table);

SELECT count(*) AS unique_rows12 FROM (SELECT DISTINCT lower(column1),lower(column1) FROM table);

有更有效的方法吗?有没有办法在一个查询中执行此操作?我使用SQLite3。

提前致谢。

修改(由于@ypercube's response): 排序是默认的(区分大小写,至少我没有COLLATE NOCASE在任何地方)。

此外,我已经进行了测试,并且使用COLLATE NOCASE它的速度相当快且数字相同:

# time echo "SELECT count(DISTINCT lower(column1)), count(DISTINCT lower(column1 || column2)) FROM table;" | sqlite3 db.sqlite3
1643|5997
echo   0.00s user 0.00s system 25% cpu 0.003 total
sqlite3 db.sqlite3  0.58s user 0.04s system 96% cpu 0.643 total

# time echo "SELECT count(DISTINCT column1), count(DISTINCT column1 || column2) FROM table;" | sqlite3 db.sqlite3              
1658|6199
echo   0.00s user 0.00s system 36% cpu 0.002 total
sqlite3 db.sqlite3  0.42s user 0.04s system 95% cpu 0.483 total

# time echo "SELECT count(DISTINCT column1 COLLATE NOCASE), count(DISTINCT (column1 || column2) COLLATE NOCASE) FROM table;" | sqlite3 db.sqlite3
1643|5997
echo   0.00s user 0.00s system 32% cpu 0.002 total
sqlite3 db.sqlite3  0.43s user 0.04s system 98% cpu 0.481 total

COUNT(DISTINCT column1, column2)显示错误:wrong number of arguments to function count(),但我希望我有你的想法。

2 个答案:

答案 0 :(得分:3)

你可以试试这个:

SELECT count(distinct lower(column1))
  FROM table

第二个:

SELECT count(distinct lower(column1 || column2))
  FROM table

注意:在第二种情况下,如果列可以为空,则必须使用coalesce。

答案 1 :(得分:1)

我认为默认情况下,文本比较不区分大小写。这有用吗?

SELECT COUNT(DISTINCT column1)
     , COUNT(DISTINCT column1, column2)
FROM table