2011-01-28 276 views
0

私は、問題がどこにあるか見つけることができない、まだ2日間このクエリで戦っとされています。メッセージ102、レベル15、状態1、行15付近に正しくない構文「)」

SQLクエリは、このようなものです:

select t2.transno, 
    case 
    when (Select Count (*) 
     From v1 
     where v1.transno < v1.transno) > 1 
    then (
    case 
    when (Select Top 1 v1.transno 
      From v1 
      Where v1.transno < v1.transno 
      Order By v1.transno Desc)=(T2.transno-1) 
    then ' ' 
    else 'Missing Invoice') 
    else '' 
    end AS Marker 
FROM v1 AS T2 

それは私にエラーメッセージを与えている:

Msg 102, Level 15, State 1, Line 15 Incorrect syntax near ')'. 
+0

としてより簡単に表現することができます。 SELECTに行ごとに2つの相関サブクエリがあり、パフォーマンスが悪いことを意味します。それは迅速だ場合オプティマイザが実現しているため、それがv1.transno gbn

+0

そので、1つの番号はマーカーcolumn.Iで、その後it'l表示欠落している請求書が欠落している場合はそれを行っていますアクセスでは正常に動作しますが、私はSQL Serverの2005年にそれを実行するための構文を変更したときに、私はあなたの提案を試してみましたが、エラー – Monshine

答えて

0

あなたの二case文は、それが必要と終わりに、不足しています。これを試してみてください:

select t2.transno, 
    case 
    when (Select Count (*) 
     From v1 
     where v1.transno < v1.transno) > 1 
    then (
    case 
    when (Select Top 1 v1.transno 
      From v1 
      Where v1.transno < v1.transno 
      Order By v1.transno Desc)=(T2.transno-1) 
    then ' ' 
    else 'Missing Invoice') end 
    else '' 
    end AS Marker 
FROM v1 AS T2 
1

私はあなたがこの文に終止符を打つことを忘れ推測:else 'Missing Invoice')else 'Missing Invoice') end

select t2.transno, 
    case 
    when (Select Count (*) 
     From v1 
     where v1.transno < v1.transno) > 1 
    then (
    case 
    when (Select Top 1 v1.transno 
      From v1 
      Where v1.transno < v1.transno 
      Order By v1.transno Desc)=(T2.transno-1) 
    then ' ' 
    else 'Missing Invoice' 
    end) 
    else '' 
    end AS Marker 
FROM v1 AS T2 
+0

を取得しますが、このerror.Msg 4104、レベル16、状態1、行34マルチパート識別子」を取得していますt2.transno "はバインドできませんでした。 – Monshine

+0

@Monshine:テーブル名は大文字と小文字が区別されますか? 't2'を' T2'に変更してみてください。 –

0

のように試してみてください、これが答えであれば、私は知りませんが、私はTop 1がすべきだと思いますTop (1)となります。 (See here)

0

v1.transno < v1.transno常にfalse =ゼロ行です。

だからあなたのクエリが

SELECT v1.transno, 'Missing Invoice' AS Marker FROM v1 
もっと真剣に

のように書き換えることができ、私はあなたが私たちのテーブル、データおよび所望の出力を与える方が良いと思う

select t2.transno, 
    case 
     when foo.maxtransno IS NULL THEN 'Missing Invoice' 
     ELSE ' ' 
    END AS Marker 
FROM 
    v1 AS T2 
    OUTER APPLY 
    (Select MAX(v1.transno) AS maxtransno 
      From v1 
      Where v1.transno < t2.transno 
      HAVING MAX(v1.transno) = T2.transno-1 
    ) foo 
+0

申し訳ありませんがsql server.I私のあなたの解決策を試してみましたが、メッセージ4104、レベル16、状態1、行50マルチパーツ識別子 "t2.transno"にバインドすることができませんでした。 "foo"は意味します。私はそれを交換する必要がありますか? – Monshine

関連する問題