【问题标题】:Conditional logic on SQL aliasesSQL 别名的条件逻辑
【发布时间】:2010-02-14 16:32:41
【问题描述】:

我有一个将历史价格信息拼凑在一起的 SQL 查询。它不是特别干净,可能会进行很多优化。原因之一是我使用子查询通过子查询获取“上一个”价格值并将其分配给别名“last_value”。理想情况下,我希望能够在查询 WHERE 子句中使用此别名,而不必重新执行查找。

我理解为什么这是不可能的(据我所知,SQL 查询是从右到左解析的,在数据​​被传回之前应用了别名)。我只是想在这里发帖询问是否可以使用其他方式来实现这样的事情。

具体来说,我很想通过 SQL 计算 p.value (当前值)和 last_value (最后一个值)之间的百分比差异,而不是必须在应用程序层进行计算。

我曾考虑将百分比差异作为单独的列存储在表本身中,但这似乎有点倒退(考虑到所涉及的逻辑微不足道,唯一的绊脚石是别名的使用)。

我正在使用 MySQL。

$sql = "SELECT 
                t.*,
                p.value,
                p.timestamp,
                (SELECT 
                    value 
                FROM 
                    prices 
                WHERE 
                    prices.id = p.id AND 
                    prices.country=':country' AND 
                    prices.timestamp < p.timestamp
                ORDER BY 
                    prices.timestamp DESC 
                LIMIT 1) AS last_value
            FROM
                prices AS p,
                titles AS t
            WHERE
                t.row_id = p.id AND
                p.country = ':country' AND
                p.current = 1 AND
                (SELECT 
                    value 
                FROM 
                    prices 
                WHERE 
                    prices.id = p.id AND 
                    prices.country=':country' AND 
                    prices.timestamp < p.timestamp
                ORDER BY 
                    prices.timestamp DESC 
                LIMIT 1) IS NOT NULL
            ORDER BY
                p.timestamp DESC
            LIMIT :offset, :limit";

【问题讨论】:

  • 哪个 DBMS?每个人的答案都会大不相同。
  • 对不起,应该指定。 MySQL。

标签: sql logic boolean alias


【解决方案1】:

我从未真正使用过 MySQL,但在 SQL Server 中我会这样做:

SELECT (last.value - current.value) / last.value AS percentage
FROM (SELECT .... ) AS last
INNER JOIN (SELECT ...) AS current
ON last.PK = current.PK

我相信它在 MySQL 中可能仍然有效,因为它几乎是标准的 SQL-92。这是关于此的 MySQL 文档的链接: http://dev.mysql.com/doc/refman/5.0/en/unnamed-views.html

【讨论】:

    【解决方案2】:

    Alexander 的想法是正确的(很遗憾,我不能投票给你,因为我已经注册了一个合适的 Stackoverflow 帐户)。我最终使用的 SQL:

    SELECT
                        current.*,
                        last.value AS last_value
                    FROM
                        (SELECT
                            t.*,
                            p.id AS p_id,
                            p.value,
                            p.timestamp
                        FROM
                            prices AS p,
                            titles AS t
                        WHERE
                            t.row_id = p.id AND
                            p.country = ':country' AND
                            p.current = 1
                        ) current
                    INNER JOIN
                        (SELECT 
                            prices.* 
                        FROM 
                            prices 
                        WHERE 
                            prices.country = ':country' AND
                            prices.current = 0
                        ORDER BY
                            prices.timestamp DESC) last 
                        ON 
                            last.id = current.p_id AND 
                            last.timestamp < current.timestamp
                    GROUP BY
                        current.row_id
                    ORDER BY
                        current.timestamp DESC,
                        current.name ASC
                    LIMIT :offset, :limit
    

    【讨论】:

      猜你喜欢
      • 2015-10-14
      • 2020-03-22
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多