【问题标题】:SQLite: distinguish between table and column aliasSQLite:区分表和列别名
【发布时间】: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 itthread 似乎表明 SQLite 也是如此。但是,我无法验证文档中的报价。
  • 它应该只执行一次 - SQL 引擎应该明白这一点。 (你可以测试一下,是吗?)好吧,我不知道 MySQL 的非标准方式 :) 然后我会使用不同的别名 - 但这当然不能回答你的问题。

标签: sql sqlite


【解决方案1】:

LEFT JOIN 所有返回表,然后添加 WHERE 类似

COALESCE(b.ret_used, c.ret_used, d.ret_used....) is not NULL

您可能需要类似的策略来确定 TOTAL 中的哪个ret_used。仅供参考,TOTAL 永远不会返回 NULL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多