Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法绑定多部分标识符-SQL Server 2014_Sql_Sql Server_Tsql_Sql Server 2014 - Fatal编程技术网

无法绑定多部分标识符-SQL Server 2014

无法绑定多部分标识符-SQL Server 2014,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我正在尝试解决下面查询中的错误 是的,我检查了许多相同的问题,但仍然无法找到解决方案 错误: 无法绑定多部分标识符“Table_2.id” 当我删除内部连接时,查询运行得非常好 我必须在不将其转换为显式联接的情况下解决这个问题,因为我有太多的动态筛选,它们在查询末尾添加和x=y子句 多谢各位 SELECT TOP 10 username, NAME, table_1.authoritylevel, tota

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

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

错误:

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

当我删除内部连接时,查询运行得非常好

我必须在不将其转换为显式联接的情况下解决这个问题,因为我有太多的动态筛选,它们在查询末尾添加
和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 

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

另一个考虑因素是使用表别名,并使用相应的表别名为每一列添加前缀,即使为了可读性和易于维护的代码,这些表之间的列是唯一的

您还缺少聚合功能所需的
groupby
。总而言之,固定代码为:

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;

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

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

另一个考虑因素是使用表别名,并使用相应的表别名为每一列添加前缀,即使为了可读性和易于维护的代码,这些表之间的列是唯一的

您还缺少聚合功能所需的
groupby
。总而言之,固定代码为:

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;

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

如果您希望保留隐式连接,可以使用WITH将查询拆分为多个结果集。根据,您不能再进行“隐式外部联接”。请尝试一下:

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

如果您希望保留隐式连接,可以使用WITH将查询拆分为多个结果集。根据,您不能再进行“隐式外部联接”。请尝试一下:

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


好吧,你知道显式连接,那么为什么要把它和隐式连接混在一起呢?。此外,这将失败,因为没有
GROUP BY
@Lamak,因为它们具有相同的性能,并且对我来说更容易阅读:D它需要更少的代码行:。啊,让我检查一下分组bydoes表2有一个
id
列吗?@Lamak是的,它有。更新了问题哦,太好了,现在我的整个代码都无效了,叹气。好吧,你知道显式连接,那么为什么要将它与隐式连接混合呢?。此外,这将失败,因为没有
GROUP BY
@Lamak,因为它们具有相同的性能,并且对我来说更容易阅读:D它需要更少的代码行:。啊,让我检查一下分组bydoes表2有一个
id
列吗?@Lamak是的,它有。更新了问题哦,太好了,现在我的全部代码都无效了,sigh.ty让我试试答案。另外,我已经重写了问题,以防止分组。你能检查我更新的问题吗?实际上,我有很多动态筛选,在末尾添加了很多“and”子句。因此,将它们转换为显式连接严重破坏了我的代码:(@MonsterMMORPG嗯,我只能回答这个问题的范围。如果是这样的话,那么只使用隐式连接,而不是隐式和显式连接的混合。如果不将所有内容都转换为显式连接,就无法修复。顺便问一下,更新的问题呢?我的意思是,即使使用显式连接,也要以某种方式添加内联选择join@MonsterMMOR正如我所说,您只能使用隐式连接,但我不会写那个答案(因为我不喜欢它们).关于更新后的问题,是的,我需要改变我的整个答案,并且理解最后一列应该是什么,现在我只是没有时间来回答。让我试试。我还重写了问题以防止分组。你能检查我更新后的问题吗?事实上,我有很多动态过滤,这增加了很多“and”子句的结尾。因此,将它们转换为显式联接严重破坏了我的代码:(@MonsterMMORPG嗯,我只能回答这个问题的范围。如果是这样的话,那么只使用隐式连接,而不是隐式和显式连接的混合。如果不将所有内容都转换为显式连接,就无法修复。顺便问一下,更新的问题呢?我的意思是,即使使用显式连接,也要以某种方式添加内联选择join@MonsterMMOR正如我所说,你可以只使用隐式连接,但我不打算写那个答案(因为我不喜欢它们)。关于更新的问题,是的,我需要改变我的整个答案,并且理解最后一列应该是什么,现在我没有时间了