【问题标题】:SQL Server error: the multi-part identifier "C.Name" could not be boundSQL Server 错误:无法绑定多部分标识符“C.Name”
【发布时间】:2016-05-27 17:51:28
【问题描述】:

我有这个 SQL 查询:

CREATE VIEW QueryV5 
AS
    SELECT DISTINCT 
        C.Name, P.Name, SUM(Duration.Time) AS TotalTime
    FROM 
        cmpt354_starwars.dbo.Characters C, 
        cmpt354_starwars.dbo.Planets P, 
        (SELECT (T.[Time of Departure] - T.[Time of Arrival]) AS Time 
         FROM cmpt354_starwars.dbo.TimeTable T 
         WHERE T.CharacterName = C.Name AND T.PlanetName = P.Name) AS Duration
    WHERE 
        P.Affiliation = 'neutral'

我得到了错误:

消息 4104,级别 16,状态 1,过程 QueryV5,第 3 行
无法绑定多部分标识符“C.Name”。

消息 4104,级别 16,状态 1,过程 QueryV5,第 3 行
无法绑定多部分标识符“P.Name”。

我不明白发生了什么,为什么它不允许我使用 Duration 作为嵌套查询的别名。我已经将我的查询与其他人的查询进行了比较,但我看不到任何语法差异。怎么回事?

【问题讨论】:

标签: sql sql-server


【解决方案1】:

C.Name, P.Name 两者具有相同的列名,这会导致问题。请为任一列提供不同的别名将解决问题。

这样可以

SELECT DISTINCT C.Name, P.Name, SUM(Duration.Time) AS TotalTime

替换为:

SELECT DISTINCT C.Name, P.Name AS PlantName, SUM(Duration.Time) AS TotalTime

更新:

您可以尝试使用 JOIN 方法

CREATE VIEW QueryV5 AS 
SELECT DISTINCT 
    C.Name, P.Name AS PlanetName, SUM(T.[Time of Departure] - T.[Time of Arrival]) AS TotalTime 
FROM cmpt354_starwars.dbo.TimeTable T 
JOIN cmpt354_starwars.dbo.Characters C ON C.Name = T.CharacterName
JOIN cmpt354_starwars.dbo.Planets P ON P.Name = T.PlanetName
WHERE P.Affiliation = 'neutral' 
GROUP BY C.Name, P.Name

【讨论】:

  • 看起来应该可以,但我刚刚尝试过,错误仍然存​​在。完全相同的错误,新查询:CREATE VIEW QueryV5 AS SELECT DISTINCT C.Name, P.Name AS PlanetName, SUM(Duration.Time) AS TotalTime FROM cmpt354_starwars.dbo.Characters C, cmpt354_starwars.dbo.Planets P, (SELECT (T .[出发时间] - T.[到达时间]) AS Time FROM cmpt354_starwars.dbo.TimeTable T WHERE T.CharacterName = C.Name AND T.PlanetName = P.Name) AS Duration WHERE P.Affiliation = 'neutral '
  • 现在我得到一个不同的错误:消息 8120,级别 16,状态 1,过程 QueryV5,第 8 行列 'cmpt354_starwars.dbo.Characters.Name' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
  • @user2469321:在最后添加GROUP BY C.Name, P.Name,查看更新后的答案
【解决方案2】:

请使用 ANSI 的 JOIN 语法:

CREATE VIEW QueryV5 
AS 

SELECT  T.CharacterName, 
        T.PlanetName, 
        SUM(T.[Time of Departure] - T.[Time of Arrival]) AS TotalTime 
FROM cmpt354_starwars.dbo.TimeTable T 
INNER JOIN cmpt354_starwars.dbo.Planets P
    ON T.PlanetName = P.Name
INNER JOIN cmpt354_starwars.dbo.Characters C
    ON T.CharacterName = C.Name 
WHERE P.Affiliation = 'neutral'
GROUP BY T.CharacterName, T.PlanetName

并且不需要C.NameP.Name - 使用来自TimeTable 的列。

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多