连接表变量和派生表

时间:2010-11-23 14:17:07

标签: sql-server tsql

在下面的查询中@processtable是一个表变量,当我尝试加入它时,temp是派生表我收到以下错误:

  

列前缀“t”与查询中使用的表名或别名不匹配。

SELECT t.Order
       ,CONVERT(NVARCHAR, temp.[DateTime], 101) AS [DateTime] 
       ,t.Status
       ,t.Domain
       ,t.Media
       ,t.Approved      
       ,t.CreatedBy     
FROM @ProcessTable t
JOIN (SELECT MAX(Id),Order FROM OrderDetail OD WHERE  OD.Order = t.Order) temp
ON temp.Order = t.Order 
ORDER BY temp.[DateTime] DESC, Approved ASC

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT     t.Order
        ,CONVERT(NVARCHAR,temp.[DateTime],101) AS [DateTime] 
        ,t.Status
        ,t.Domain
        ,t.Media
        ,t.Approved     
        ,t.CreatedBy        
    FROM @ProcessTable t
    JOIN (SELECT MAX(Id) AS LatestId, Order FROM OrderDetail OD GROUP BY Order)  temp
    ON temp.Order = t.Order 
    ORDER BY temp.[DateTime] DESC, Approved ASC

注意,我已删除嵌套SELECT中的OD.Order = t.Order子句并添加到GROUP BY中。该连接旁边的条件(temp.Order = t.Order)进行过滤,因此不需要在嵌套选择中 - 它导致错误。另外,当您使用聚合函数(MAX)时,您需要GROUP BY。

另外,我已经将MAX(Id)的别名作为

返回

答案 1 :(得分:0)

你几乎是正确的......如果要将其作为加入条件之一包含在内,那么你不需要派生表中的where子句。

SELECT     
  t.Order
  ,CONVERT(NVARCHAR,temp.[DateTime],101) AS [DateTime] 
  ,t.Status
  ,t.Domain
  ,t.Media
  ,t.Approved     
  ,t.CreatedBy        
FROM @ProcessTable t
JOIN (SELECT MAX(Id) AS MaxID,Order, Max([DateTime]) AS [DateTime] FROM OrderDetail OD Group By Order)  temp
  ON temp.Order = t.Order 
ORDER BY temp.[DateTime] DESC, Approved ASC

答案 2 :(得分:0)

我认为你不能在子查询中引用t.Order。您应该只依靠连接来处理该子句。

E.g。只需删除OD.Order = t.Order并允许join子句处理它。