【问题标题】:How can I reference a calculated field in a subquery?如何在子查询中引用计算字段?
【发布时间】:2014-09-26 13:51:43
【问题描述】:

我有以下无效的查询,但显示了我打算做什么:

SELECT
    REPLACE(j.wo_id, 'PREFIX.', '') AS WOID,
    j.act_finish_time_local,
    STUFF ((SELECT ', '+item_id FROM bom_item WHERE parent_item_id = WOID AND bom_pos > 0 FOR XML PATH('')), 1, 1, '') AS Families
FROM job AS j
INNER JOIN job_event je ON je.wo_id = j.wo_id AND je.oper_id = j.oper_id 
WHERE j.oper_id = 'Sawing' AND j.wo_id LIKE 'PREFIX.%' AND j.act_finish_time_local IS NOT NULL 
GROUP BY j.wo_id, j.act_finish_time_local 
ORDER BY j.act_finish_time_local 

这里是示例数据表:

表:工作

| wo_id       | act_finish_time_local | oper_id |
|-------------|-----------------------|---------|
| PREFIX.0001 | 2014/01/01            | Sawing  |
| PREFIX.0002 | 2014/01/01            | Sawing  |

表:job_event

| wo_id       | oper_id |
|-------------|---------|
| PREFIX.0001 | Sawing  |
| PREFIX.0002 | Sawing  |

表:bom_item

| parent_item_id | item_id | bom_pos |
|----------------|---------|---------|
| 0001           | abc     | 1       |
| 0001           | def     | 2       |
| 0002           | qrs     | 1       |
| 0002           | tuv     | 2       |

预期结果

| WOID | act_finish_time_local | Families |
|------|-----------------------|----------|
| 0001 | 2014/01/01            | abc, def |
| 0002 | 2014/01/01            | qrs, tuv |

现在,查询无法编译,因为 SQLServer 抱怨 WOID 字段不可用。

有没有办法解决这个问题?

【问题讨论】:

    标签: tsql correlated-subquery


    【解决方案1】:

    您不能在子查询中引用计算字段或别名...

    您必须在子查询中再次计算它或在 CTE 中定义它,然后在 CTE 之外重新使用它

    有一篇关于这个主题的有趣文章可能会让你感兴趣

    http://joecelkothesqlapprentice.blogspot.ch/2006/06/reference-alias-field-name.html

    【讨论】:

    • 我害怕那个。 :(
    • CTE 会比重新计算字段更高效吗?如果是这样,那么我将如何构建 CTE?
    • 通常,CTE 不会提高性能。它基本上是一次性视图。它们是不可索引的并且不能有约束。我真的无法回答它是否比重新计算更快......你必须尝试一下:)你可以像这样构建一个 CTE:WITH cte (Column1, Column2, Column3) AS ( SELECT Column1, Column2, Column3 FROM SomeTable ) SELECT * FROM cte
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    相关资源
    最近更新 更多