【问题标题】:Multiple select statements with joins, Multi-part identifier could not bound多个带有连接的选择语句,无法绑定多部分标识符
【发布时间】:2021-05-28 13:35:44
【问题描述】:

错误信息:

消息 4104,第 16 级,状态 1,第 78 行
无法绑定多部分标识符“C1.Name”

消息 4104,第 16 级,状态 1,第 78 行
无法绑定多部分标识符“C2.Name”

我认为这是因为 C1.Name 和 C2.Name 都没有与 Alias R 绑定?

SELECT  
    R.MapID AS MAPID, C1.Name AS IDFrom, C2.Name AS IDTo, R.Distance
FROM 
    (SELECT
         R.MapID AS MAPID, C1.Name AS IDFrom, C2.Name AS IDTo, R.Distance,

     FROM
         ROAD R
     INNER JOIN 
         CITY C1 ON C1.ID = R.IDfrom
     INNER JOIN 
         CITY C2 ON C2.ID = R.IDto) R
 

如果我尝试在外部选择中使用 Select *,它实际上可以工作,但会添加我不想要的 seqnum 列

【问题讨论】:

  • 在您的子查询之外,C1C2 没有上下文;子查询别名为R,而不是C1,等等。
  • 是的,在外部查询中为正确的对象 R 设置别名。
  • 并且不要重复使用相同的别名 - 只会增加混乱。
  • 应该是R.IDFromR.IDTo。您在内部子查询中命名了它们。
  • @marcos 就在钱上。非常感谢

标签: sql


【解决方案1】:
SELECT  R.MapID as MAPID,  R.IDFrom, R.IDTo, R.Distance
 FROM 
    (SELECT
          R.MapID as MAPID,  C1.Name as IDFrom, C2.Name as IDTo, R.Distance,
          ROW_NUMBER() OVER (PARTITION BY R.MapID ORDER BY R.distance DESC) AS seqnum
     FROM
          ROAD R
          INNER JOIN CITY C1 
          ON C1.ID = R.IDfrom
          INNER JOIN CITY C2
          ON C2.ID = R.IDto ) R
 WHERE  
      seqnum = 1

【讨论】:

  • 是的,既是表别名也是列别名问题。这个答案看起来解决了这两个问题。
  • @mike6383 非常感谢
【解决方案2】:

当您有类似上述的派生查询(使用另一个查询创建临时表)时,别名是本地的。下表只能在 FROM 的括号内调用:

ROAD R
INNER JOIN CITY C1 
ON C1.ID = R.IDfrom
INNER JOIN CITY C2
ON C2.ID = R.IDto

最后,您已将该派生表别名为 R,这意味着您需要括号内的任何数据都需要别名为 R(见下文)

 SELECT  R.MAPID,  R.IDFrom, R.IDTo, R.Distance
 FROM (
       SELECT
          R.MapID as MAPID,  C1.Name as IDFrom, C2.Name as IDTo, R.Distance,
          ROW_NUMBER() OVER (PARTITION BY R.MapID ORDER BY R.distance DESC) AS seqnum
       FROM ROAD R
       INNER JOIN CITY C1 
       ON C1.ID = R.IDfrom
       INNER JOIN CITY C2
       ON C2.ID = R.IDto 
 ) R
 WHERE R.seqnum = 1

在整个查询中为所有列设置别名也是最佳做法,因此我添加了R.seqnum = 1

【讨论】:

  • @Cicada3301 是的,没错。我完全忘记了那部分。我现在会编辑它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2010-11-02
  • 2023-03-21
相关资源
最近更新 更多