WHERE子句中对别名的SQL引用

时间:2013-10-21 11:35:52

标签: mysql sql coldfusion coldfusion-10

我目前正在开发一个查询,它会查询查询中的所有相关数据和库存水平,而不是单独循环查看库存水平。到目前为止,我已经设法通过这样做获得了这些库存水平:

<cfquery datasource="datasource" name="get">
    Select *,
    (
        Select IsNull(Sum(stocklevel))
        From itemstock
        Where item_id = itemstock_itemid
    ) As stock_count
    From items
    Where item_id = #URL.item_id#
</cfquery>

现在我在“Where”子句之后尝试添加的术语是:

And get.stock_count > 0

然而,这只是抛出一个错误并说它不是一个有效的字段(这是有道理的)我想知道,我如何参考该总和?

4 个答案:

答案 0 :(得分:2)

你不能引用'get。'在查询中。我想如果你只是参考stock_count你会没事的吗?

答案 1 :(得分:2)

要引用别名,请使用派生表:

select * from 
(Select *,
(
    Select IsNull(Sum(stocklevel), 0)
    From itemstock
    Where item_id = itemstock_itemid
) As stock_count
From items
Where item_id = <cfqueryparam value="#URL.item_id#">
) derived_table
where stock_count > 0

请注意,我的查询参数标记不完整。它需要一种数据类型,但你可以这样做。

答案 2 :(得分:2)

您无法以您尝试的方式引用别名。但这仍然可以在SQL级别解决,而不涉及CF. E.g:

WITH Stocks AS 
( Select *,
  (
    Select IsNull(Sum(stocklevel))
    From itemstock
    Where item_id = itemstock_itemid
  ) As stock_count
  From items
  Where item_id = #URL.item_id#
)
SELECT * FROM Stocks WHERE stock_count > 0

另外,您当然可以使用CF的查询查询,因此有了原始查询,您可以选择以下内容:

<cfquery dbtype="query" name="get_only_what_i_need">
select *
from get
where stock_count > 0
</cfquery>

首选解决方案是首选,因为它将所有查询保持在数据库级别。

答案 3 :(得分:-1)

你需要给它一个新名字:

...
Select IsNull(Sum(stocklevel)) as SumTotal
...
And stock_count.SumTotal > 0