3

我花了几个小时研究应该是一个非常简单的 T-SQL 语句的答案。
这是情况。我很想通过帮助台数据库进行报告。我有一个表(calllog),其中包含有关故障单的基本非重复信息和另一个事务表(Asgnmnt),其中包含对不同人员的各种分配以解决问题。我只是试图确定 Asgnmnt 表中的最后一个分配,将其与呼叫日志文件链接,并在外部选择中使用该数据来进行更多数据报告。Asgnmnt 表包含一个名为 HEATSeq 的字段。给定 CallID 的最高 HEATSeq 将是最后一个分配。这是我的 T-SQL 语句和错误。

SELECT
Callid,
Priority,
RecvdDate,
RecvdTime,
ClosedDate,
ClosedTime,
CustID,
CallType,
CallDesc,
HeatSEQ#
FROM
      (Select 
      a.Callid, 
      a.Priority,
      a.RecvdDate,
      a.RecvdTime,
      a.ClosedDate,
      a.ClosedTime,
      a.CustID,
      a.CallType,
      a.CallDesc,
      (select TOP 1 HEATSeq from Asgnmnt f
      WHERE  a.CallID = f.CallID
      ORDER BY HEATSeq desc) as HeatSeq#
      FROM dbo.CallLog a 
      where a.CallID = '00520308') as z
LEFT OUTER JOIN dbo.Asgnmnt c on z.Callid=c.CallID and z.HeatSeq# = c.HEATSeq

这是[错误]

Msg 209, Level 16, State 1, Line 2
Ambiguous column name 'Callid'.
Msg 209, Level 16, State 1, Line 9
Ambiguous column name 'CallType'
4

2 回答 2

7

您可能在 z 和 c 中都有 Callid 和 CallType(至少)。至少为外部查询中的那些列使用表别名:

SELECT
z.Callid, -- No longer ambiguous
z.Priority,
z.RecvdDate,
z.RecvdTime,
z.ClosedDate,
z.ClosedTime,
z.CustID,
z.CallType,
z.CallDesc,
z.HeatSEQ#
FROM
      (Select 
      a.Callid, 
      a.Priority,
      a.RecvdDate,
      a.RecvdTime,
      a.ClosedDate,
      a.ClosedTime,
      a.CustID,
      a.CallType,
      a.CallDesc,
      (select TOP 1 HEATSeq from Asgnmnt f
      WHERE  a.CallID = f.CallID
      ORDER BY HEATSeq desc) as HeatSeq#
      FROM dbo.CallLog a 
      where a.CallID = '00520308') as z
LEFT OUTER JOIN dbo.Asgnmnt c on z.Callid=c.CallID and z.HeatSeq# = c.HEATSeq
于 2013-04-04T17:58:47.780 回答
2

您应该使用 FROM 子句中的适当表别名,例如 zCallid 或 c.Callid 来完全限定外部 SELECT 中的所有列名。由于您留在 Callid 上,因此结果集中可能存在 z.Callid 不为空但 c.Callid 为空的行。CallType 也是如此。

于 2013-04-04T18:04:52.970 回答