2017-02-24 71 views
-1

希望有人可以帮我清理一个查询,我遇到了问题。在我从每组修订版中返回最新修订版后,我试图将结果分成一半。查询SQL服务器时SQL语法错误

我可以用这一半的结果分为:

SELECT * 
     FROM 
     (
     SELECT *, ntile(2) over(order by ID) as tile_nr 
     FROM dbTable 
    ) x 
    WHERE x.tile_nr = 1 

我可以从修订的群体获得的最新修订本:

SELECT b1.* 
     FROM dbTable b1 
     INNER JOIN 
      (
       SELECT ID, max(revision) as revision 
       FROM dbTable 
       GROUP BY ID 
      ) as b2 
      ON b1.ID = b2.ID and 
      (
       b1.revision = b2.revision or b2.revision is null 
      ) 

但是,当我尝试将这些查询合并成一个这样的:

SELECT * 
    FROM 
    (
     SELECT *, ntile(2) over(order by ID) as tile_nr 
     FROM 
     (
      SELECT b1.* 
      FROM dbTable b1 
      INNER JOIN 
       (
        SELECT ID, max(revision) as revision 
        FROM dbTable 
        GROUP BY ID 
      ) as b2 
      ON b1.ID = b2.ID and 
       (
        b1.revision = b2.revision or b2.revision is null 
      ) 
     ) 
    ) x 
    WHERE x.tile_nr = 1 

我得到一个 “错误snytax附近 ')'” 的错误。它似乎不喜欢最后一个括号。

任何帮助将不胜感激。

回答

3

这是那些情况下缩进在调试有用之一:

SELECT * 
FROM 
(
    SELECT *, ntile(2) over(order by ID) as tile_nr 
    FROM 
    (
     SELECT bt.* 
     FROM dbTable b1 
     INNER JOIN 
     (
      SELECT ID, max(revision) as revision 
      FROM dbTable 
      GROUP BY ID as b2 
      ON b1.ID = b2.revision or b2.revision is null 
     ) 
    ) 
) x 
WHERE x.tle_nr = 1 

具体,你的内心SELECT包括ON子句并不在该范围内才有意义。你需要生成子查询结果集,别名一个名称,然后在你的加入condtions使用别名名称:

SELECT bt.* 
    FROM dbTable b1 
    INNER JOIN 
    (
     SELECT ID, max(revision) as revision 
     FROM dbTable 
     GROUP BY ID 
    ) as b2 
    ON b1.ID = b2.revision or b2.revision is null 

跟进编辑:

它看起来像走样子查询,你NTILE() SELECT解决了这个问题:

SELECT *, ntile(2) over(order by ID) as tile_nr 
    FROM 
    (subquery) as subQ 
+0

感谢您的快速回复@lyrisey。哇,我意识到在发布时我在语法上犯了几个错误。由于安全限制,我在另一台机器上工作时不得不重新输入。我修改了我的原始文章。 – dmod40

+0

已更新。别名子查询通常是很好的做法,所以你总是使用已知名称。 – lyrisey

+0

明白了,吸取了教训!非常感谢@lyrisey。 – dmod40