【问题标题】:Why can't I access a field defined as "Select 1" from a subquery in the outer query?为什么我不能从外部查询的子查询中访问定义为“Select 1”的字段?
【发布时间】:2017-10-20 15:19:27
【问题描述】:

我有这个子查询:

LEFT JOIN (SELECT 1 as exist
                  , MAX (ev.EventDate) as eventdate
                  , evt.EventCode
                  , CCaseID
           FROM stg.Event ev 
           JOIN stg.EventTemplate evt 
             ON ev.EventTemplateID = evt.ID
           WHERE evt.EventCode = 'UN002' 
           Group by CCaseID, evt.EventCode) as un002
    ON un002.CCaseID = ev.CCaseID
WHERE evt.EventCode = 'UN001' 
  AND (un002.eventdate < ev.eventdate OR un002.eventdate IS NULL)
Group by ev.CCaseID, evt.EventCode) as un001
  ON cc.ID = un001.CCaseID

我现在正尝试按照un001.exist 访问外部查询中的存在字段,但 SQL Server 告诉我这是一个无效字段。我错过了什么?

【问题讨论】:

  • 如果该列被称为 1,只需尝试用方括号将数字 [1] 括起来,如图所示。
  • 您是在问为什么无法访问主查询中名为“exist”的列吗?
  • 嗯....un001.exist 不是有效的列。您将该子查询命名为 un002。这会让您更容易查看是否有更好的格式。
  • 我敢打赌这是一个更高级别的问题。这看起来像是一个乱七八糟的查询。

标签: sql sql-server tsql subquery sql-server-2014


【解决方案1】:

un001没有exist该字段属于un002子查询。

还有一个GROUP BY 和ON,所以那里缺少一些代码。

您应该简化代码并使用 CTE 使其易于阅读和调试。

类似这样的:

WITH un001 as ( SELECT ... ), 
un002 as ( SELECT ...)
SELECT *
FROM un001 
JOIN un002
  ON un001 .CCaseID = un002.CCaseID

【讨论】:

  • 发布的代码中没有存在的复数。
  • @SeanLange 你说得对,我完全错过了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多