重复的列名称和多部分标识符

时间:2015-07-08 17:59:32

标签: sql-server tsql

我的查询包含一些JOIN语句和一对相同的列名。在尝试解决此问题时,我现在收到以下错误

  

Msg 4104,Level 16,State 1,Line 3
  多部分标识符" v_parametersets.NAME"无法受约束。

     

Msg 4104,Level 16,State 1,Line 4
  多部分标识符" catalog.NAME"无法受约束。

以下是查询:

SELECT 
   startedon, 
   endedon, 
   v_parametersets.name As Parameter, 
   catalog.name As Category, 
   status, 
   numberprocessed, 
   errormessage 
FROM
    Prod.dbo.status ps 
INNER JOIN 
    Prod.dbo.v_parametersets vps ON bps.parametersetid = vps.parametersetid 
INNER JOIN 
    Prod.dbo.catalog pc ON ps.catalogid = pc.id 
WHERE  
    ps.endedon BETWEEN Dateadd(hh, -3, Sysdatetime()) AND Sysdatetime()

因此,表name上有一个名为catalog的列,而name上有一列名为v_parametersets的列。我需要这两个,但多部分标识符由于某种原因不能被绑定。

1 个答案:

答案 0 :(得分:3)

由于您对表进行了别名,因此在描述所选列/字段名称时必须使用别名,因为编译器已经对表进行别名并且不再具有表名,所以您无法引用表名了解原始表名。由于连接已完成并且连接已使用别名创建的临时存储解析,因此该名称基本上已超出范围。

换句话说,您告诉系统在步骤1中将Prod.dbo.v_parametersets的名称更改为VPS。 在步骤4中,您引用了在步骤1中更改的对象的名称。系统不再知道该名称(对于此查询的范围),您更改了它!

SELECT startedon, 
   endedon, 
   VPS.name As Parameter,   <--This line
   PC.name As Category,   <--This line
   status, 
   numberprocessed, 
   errormessage 
FROM   Prod.dbo.status ps 
   INNER JOIN Prod.dbo.v_parametersets vps 
           ON bps.parametersetid = vps.parametersetid 
   INNER JOIN Prod.dbo.catalog pc 
           ON ps.catalogid = pc.id 
WHERE  ps.endedon BETWEEN Dateadd(hh, -3, Sysdatetime()) AND Sysdatetime()