2017-02-24 7 views
-1

誰かが私が問題を抱えているクエリをクリーンアップするのを助けることを望んでいます。私は各リビジョンのグループから最新のリビジョンを返した後、結果を半分に分割しようとしています。SQL Serverのクエリ中に不適切な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句を含んでいます。 )

それは(あなたのNTILEというサブクエリをエイリアシングのようになります。

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 

フォロー編集:次に、あなたの参加condtionsでそのエイリアス名を使用し、それに名エイリアス、サブクエリの結果セットを生成する必要がありますSELECTは問題を解決します:

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

クイック返信@lyriseyありがとうございます。うわー、投稿中に文法にいくつか間違いを感じました。私はセキュリティの制限のために別のマシンで作業しているので、再入力しなければなりませんでした。私は訂正して元の投稿を編集しました。 – dmod40

+0

更新されました。サブクエリをエイリアスすることは、通常は既知の名前で作業するため、一般的には良い方法です。 – lyrisey

+0

それを得て、学んだレッスン!とてもおかげさまで@lyrisey。 – dmod40