1

次のクエリを使用して、テーブルの最後と次の行を取得しようとしました。

SELECT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC
UNION 
SELECT TOP 2 Nummer FROM Empfänger WHERE Nummer >= 4748 ORDER BY Nummer ASC;

主キー「Nummer」は一意で自動インクリメンタルなので、

4747, 4748, 4749

上記の数値を返す必要がありますが、代わりに次を返します。

4747, 4798, 4799

Access でデータベースを開いてフィルターを「間」に設定すると、値が正しく表示されます。

ステートメントを次のように変更しました。

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC
UNION 
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4748 
UNION 
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4748 ORDER BY Nummer ASC;

これはほぼ完璧に機能します。

4747, 4748, 4750

単一のクエリですべてのステートメントを記述すると、正しい値が返されます...

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC
= 4747
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4748 
= 4748
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4748 ORDER BY Nummer ASC;
= 4749

\

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4750 ORDER BY Nummer DESC
UNION 
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4750 
UNION 
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4750 ORDER BY Nummer ASC;

もう一度確認したところ、突然、上記のクエリが機能しました。ご協力ありがとうございました。

4

2 に答える 2

4

Access は JET エンジンを使用します。TOP句の後にORDER BYが適用されているようで、次の形式のサブクエリを使用する必要があります

select top n ...
from (
  select ...
  from table
  where ...
  order by ...
)

それを機能させるために。

于 2012-10-30T12:00:24.667 に答える
0

はい、Access はこの分野で ANSI-92 に準拠していませんが、SQL Server は ANSI-92 に準拠しており、オプションとして Access の非準拠の動作を模倣するように SQL Server を作成できます。PK である id フィールドを ORDER BY に追加して問題を回避するオプションがある状況でこれを発見しました。ソリューションによって複数フィールド ORDER BY の少なくとも 1 つのフィールドの値が連続するレコードで異なる場合、回避策は TOP パラメータに従います。キーが少なくとも 1 つのフィールドで壊れていない場合、SELECT TOP がこの驚くほど素人っぽい方法で強制されていると考えることができます。

「TOP n レコードを返し、n 番目のレコードの ORDER BY フィールドの値を調べ、その値を持つすべての追加レコードを含めます」。

于 2013-03-21T21:41:23.190 に答える