2017-02-24 56 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