【问题标题】:The multi-part identifier could not be bound - SQL Server 2014无法绑定多部分标识符 - SQL Server 2014
【发布时间】:2016-08-17 19:19:46
【问题描述】:

我正在尝试解决以下查询中的错误

是的,我检查了许多相同的问题,但仍然无法找出解决方案

错误:

无法绑定多部分标识符“Table_2.id”。

当我删除内部连接时,查询运行良好

我必须在不将其转换为显式联接的情况下解决此问题,因为我有很多动态过滤,它们会将 and x=y 子句添加到查询的末尾

谢谢

SELECT TOP 10 username, 
              NAME, 
              table_1.authoritylevel, 
              totalcount, 
              avglevel, 
              table_2.pokemonid, 
              pokemonlevel, 
              table_2.id, 
              pokemonexp, 
              battlecount, 
              battlevictorycount, 
              table_1.userid 
FROM   table_1, 
       table_2, 
       table_3, 
       table_4 
       LEFT OUTER JOIN (SELECT Count(table_5.offereruserid) AS OfferCount, 
                               table_5.offereduserspokemonsid 
                        FROM   table_5 
                        GROUP  BY offereduserspokemonsid) innerQuestion 
                    ON innerQuestion.offereduserspokemonsid = table_2.id 
WHERE  table_3.pokemonid = table_2.pokemonid 
       AND pokemonplace = 'trade' 
       AND table_4.pokemonid = table_2.pokemonid 
       AND table_2.userid = table_1.userid 
       AND table_2.userid != 1 

【问题讨论】:

  • 好吧,您了解显式连接,那么为什么要将它与隐式连接混在一起呢?此外,这将失败,因为没有GROUP BY
  • @Lamak 很好,因为它们具有相同的性能并且对我来说更容易阅读:D 它需要更少的代码行:stackoverflow.com/questions/44917/…。啊让我检查分组方式
  • Table_2 是否有 id 列?
  • @Lamak 是的,它确实有。更新了问题
  • 哦,天哪,现在我的整个代码都无效了,sigh

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

如果您热衷于保留隐式连接,则可以使用 WITH 将查询拆分为多个结果集。根据this article,你不能再做“隐式外连接”。试试这个:

WITH OfferCounts as
(
    SELECT Count(table_5.offereruserid) AS OfferCount,  table_5.offereduserspokemonsid 
    FROM table_5 
    GROUP  BY offereduserspokemonsid
),
EverythingElse AS
(
    SELECT TOP 10 username, 
                  NAME, 
                  table_1.authoritylevel, 
                  totalcount, 
                  avglevel, 
                  table_2.pokemonid, 
                  pokemonlevel, 
                  table_2.id, 
                  pokemonexp, 
                  battlecount, 
                  battlevictorycount, 
                  table_1.userid 
    FROM   table_1, 
           table_2, 
           table_3, 
           table_4,
    WHERE  table_3.pokemonid = table_2.pokemonid 
           AND pokemonplace = 'trade' 
           AND table_4.pokemonid = table_2.pokemonid 
           AND table_2.userid = table_1.userid 
           AND table_2.userid != 1 

)
Select * 
From EverythingElse t1
    left join OfferCounts t2 on t1.offereduserspokemonsid = t2.id

【讨论】:

    【解决方案2】:

    具体问题来自于先使用隐式连接,然后再使用显式连接。较少的代码行不是使用隐式连接的好理由,特别是因为它已被弃用。

    另一个考虑因素是使用表别名,并为每一列加上相应的表别名,即使列在这些表之间是唯一的,以提高可读性和更易于维护的代码。

    您还缺少聚合函数所需的GROUP BY。总而言之,固定代码是:

    SELECT TOP 10 username, 
                  NAME, 
                  T1.authoritylevel, 
                  totalcount, 
                  avglevel, 
                  T2.id, 
                  T2.pokemonid, 
                  pokemonlevel, 
                  pokemonexp, 
                  battlecount, 
                  battlevictorycount, 
                  T1.userid, 
                  Count(T5.offereruserid) AS OfferCount 
    FROM   Table_1 T1
    INNER JOIN Table_2 T2
        ON T1.userid = T2.userid
    INNER JOIN Table_3 T3
        ON T2.pokemonid = T3.pokemonid
    INNER JOIN Table_4 T4
        ON T2.pokemonid = T4.pokemonid
    INNER JOIN Table_5 T5
           ON T5.offereduserspokemonsid = T2.id 
    WHERE  pokemonplace = 'trade' 
           AND T2.userid != 1 
    GROUP BY  username, 
              NAME, 
              T1.authoritylevel, 
              totalcount, 
              avglevel, 
              T2.id, 
              T2.pokemonid, 
              pokemonlevel, 
              pokemonexp, 
              battlecount, 
              battlevictorycount, 
              T1.userid;
    

    但是,正如我所说,我建议您为这些列添加相应的前缀。

    【讨论】:

    • 回答问题让我试试。我还重写了问题以防止分组,您可以查看我更新的问题吗?
    • 实际上我有很多动态过滤,在末尾添加了很多“和”子句。所以把它们变成显式连接严重破坏了我的代码:(
    • @MonsterMMORPG 好吧,我只能回答这个问题的范围。如果是这种情况,那么只使用隐式连接,而不是隐式和显式连接的混合
    • 所以如果不将所有内容都转换为显式连接,就无法修复。顺便说一句,更新的问题呢?我的意思是即使在使用显式连接时也以某种方式添加内联选择
    • @MonsterMMORPG 正如我所说,你只能使用隐式连接,但我不会写那个答案(因为我不喜欢它们)。关于更新的问题,是的,我需要更改我的整个答案并且还要了解最后一列应该是什么,现在我只是没有时间
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2013-06-23
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多