我有这个查询:
SELECT COUNT(DISTINCT Serial, DatumOrig, Glucose) FROM values;
我尝试使用SQLAlchemy
这种方式重新创建它:
session.query(Value.Serial, Value.DatumOrig, Value.Glucose).distinct().count()
但这个代码将被翻译成这个样子:
SELECT count(*) AS count_1
FROM (SELECT DISTINCT
values.`Serial` AS `values_Serial`,
values.`DatumOrig` AS `values_DatumOrig`,
values.`Glucose` AS `values_Glucose`
FROM values)
AS anon_1
这种方法不是直接调用计数函数,而是将 select distinct 包装成一个子查询。
我的问题是:使用SQLAlchemy,有哪些不同的方法可以计算多列上的不重复选择,并且它们会转化为什么?
是否有任何解决方案可以转换为我的原始查询?是否存在性能或内存使用方面的显著差异?
count(distinct ...)
)不计算其中serial、datumorig或glucose为空的行。后者计算子查询生成的所有行,包括具有NULL值的(不同的)行。虽然这并没有解释性能差异,但很可能是原因。 - Ilja EveriläExplain
。有趣的是,即使是子查询对我来说也失去了连接。其中的区别在于两种情况都使用了索引,但是在使用select distinct(...)
时,它会显示Using index; Using temporary
,而在使用count(distinct(...))
版本时,它是Using index for group-by (scanning)
。 - MattSom