查询sql server时sql语法不正确

时间:2017-02-24 23:11:15

标签: sql-server syntax-error

希望有人可以帮我清理我遇到问题的查询。在我从每组修订版中返回最新版本后,我试图将结果分成两半。

我可以将结果分成两半:

    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附近')'"'错误。它似乎不喜欢最后一个括号。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

这是缩进有助于调试的案例之一:

    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

具体来说,最内层的SELECT包含一个在该范围内没有意义的ON子句。您需要生成子查询结果集,为其命名别名,然后在加入条件中使用该别名:

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

后续编辑:

看起来像NTILE()SELECT解决问题的子查询别名:

read()