【发布时间】:2020-02-05 09:57:53
【问题描述】:
SQLite 能否区分某个别名表中的列,例如: table1.column 和在SELECT 语句中具有相同名称别名的列,即column?
这是相关的,因为我需要稍后在 HAVING 子句中引用我在 SELECT 语句中构造的列,但不能将其与别名表中的列混淆。据我所知,我无法在SELECT 语句中为要构建的表设置别名(不恢复为SELECT * FROM (SELECT ...) AS alias 之类的一些讨厌的解决方法)以确保两者都是可区分的。
这是我关心的代码的精简版本:
SELECT
a.entity,
b.DATE,
TOTAL(a.dollar_amount*b.ret_usd)/TOTAL(a.dollar_amount) AS ret_usd
FROM holdings a
LEFT JOIN returns b
ON a.stock = b.stock AND
a.DATE = b.DATE
GROUP BY
a.entity,
b.DATE
HAVING
ret_usd NOT NULL
基本上,我想摆脱那些我找不到任何回报的组,因此会显示NULL 值。我没有使用INNER JOIN,因为在我的生产代码中我合并了多种类型的返回——其中一些我可能没有数据。我只想删除那些我没有任何返回类型的返回的组。
据我了解,SQLite 文档并未解决此问题。
【问题讨论】:
-
无论如何您都不能在
having子句中使用列别名 - 使用整个表达式 (HAVING TOTAL(a.dollar_amount*b.ret_usd) NOT NULL)。 -
如果我把这个聚合再次放到
HAVING子句中,它不会被执行两次,这对性能来说会很糟糕吗?除此之外,MySQL seems to allow it 和 thread 似乎表明 SQLite 也是如此。但是,我无法验证文档中的报价。 -
它应该只执行一次 - SQL 引擎应该明白这一点。 (你可以测试一下,是吗?)好吧,我不知道 MySQL 的非标准方式 :) 然后我会使用不同的别名 - 但这当然不能回答你的问题。