2012-05-06 8 views
3

私はSQLを初めて使用しているので、私はあなたの助けが必要です。基本的に私はZipCodeのデータベースを持っており、選択したZipCodeと3項目の前に3つの項目を取得したいと考えています。私が思いついたクエリはかなり悪いです...アイテムの前後にアイテムを取得する - SQLクエリ

WITH numberedlogtable AS 
(
SELECT * 
FROM dbo.US 
) 

SELECT * 
FROM numberedlogtable 
WHERE ZipCode IN (SELECT ZipCode+i 
      FROM numberedlogtable 
      CROSS JOIN (SELECT -1 AS i UNION ALL SELECT 0 UNION ALL SELECT 1) n 
      WHERE ZipCode='91803') 

私はどこかからサンプルクエリを取得し、私の使用のために正常に変換しました。唯一の問題は、このクエリが現在のアイテムと次のアイテムを返すことです。代わりに、前の3項目、現在の項目、および次の3項目が返されます。選択された郵便番号の前に

+0

郵便番号が一意であることが保証されていない限り、以下のすべての回答が失敗することに注意してください。 – Jonatan

答えて

5

番号シーケンス生成共通テーブル式(WITH部分)を使用して:SQLにおける通常

WITH NumberedZipCodes AS 
(SELECT SELECT ROW_NUMBER() OVER (ORDER BY ZipCode) AS RowNumber, * 
FROM ZipCodes) 

SELECT * From NumberedZipCodes 
WHERE RowNumber BETWEEN 
(SELECT RowNumber FROM NumberedZipCodes WHERE ZipCode=91803) - 3 
AND (SELECT RowNumber FROM NumberedPerson WHERE ZipCode=91803) + 3 

を一致内の前または次の項目としてそのような概念は存在しません。実際には、order by句が指定されていない限り、行はSQLエンジンが適切な順序で返されます。このようなクエリを作成するには、注文を適用し、インデックス番号を生成する必要があります。これはNumberedZipCodesで行われます。 2番目の部分は、データを取得するためのクエリです。

クエリを効率的に実行するには、ZipCode列にインデックスがあることを確認してください。

0

3項目及び3つの項目

SQLに基づいて設定されるAFTEます(順で)いずれかを定義しないかぎり、それは定義された順序を有していません。

今、もっと複雑なものにならないようにしてください。最初に中央のアイテムを要求する注文を作成しなければなりません。そして、2番目のクエリでもう1つの質問をすることができます。 x + 3はトップ4のステートメントとフィルターなどで実行可能ですが、3つ前のステートメントは必ず2番目のクエリーを必要とします。それをフィルタ後

すべてが小さいと(a)の「電流線」だけでなく、すべてのためのフィルタを定義するために使用される、*定義された順序 に*あなたの行番号をジップコードを を有するcreataクエリ/ビューを想定しますライン。

しかし、まず手動で注文する必要があります。

4

「前」および「後」は、注文の文脈においてのみ意味を有する。これら二つの間のすべての

SELECT TOP(3) * 
FROM numberedlogtable 
WHERE ZipCode < '91803' 
ORDER BY ZipCode DESC 

プットUNION:

SELECT TOP(3) * 
FROM numberedlogtable 
WHERE ZipCode >= '91803' 
ORDER BY ZipCode 

は前に3行を選択する:それは次のように行うことができる後に希望のZIPコードと2行を選択し、ZIPコードで注文したいと仮定すると、それがあなたの望むものなら、それを1にするための質問。

SQL Fiddleでプレーすることができます。

関連する問題