3

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

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つのアイテムを返す必要があります。

4

3 に答える 3

5

共通テーブル式(WITHパーツ)を使用して、番号付きシーケンスを生成します。

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

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

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

于 2012-05-06T07:22:57.573 に答える
4

「前」と「後」は、注文の文脈でのみ意味を持ちます。郵便番号で注文する場合は、次のように、目的の郵便番号と2行を選択します。

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

前に3行を選択:

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

必要に応じて、これら2つのクエリの間にUNION ALLを配置して、1つにします。

SQLフィドルで遊ぶことができます。

于 2012-05-06T07:51:20.410 に答える
0

選択した郵便番号の前に3つのアイテム、後に3つのアイテム

SQLはセットベースであり、1つを定義しない限り(順序は)、順序は定義されていません。

さて、もっと複雑なものに取り掛からないようにしましょう。最初に、中央のアイテムを要求する注文を作成する必要があります。次に、2番目のクエリで他の6を要求できます。申し訳ありませんが、他の方法はありません。x + 3は、トップ4ステートメントやフィルターなどで実行できます。ただし、前の3では、必ず2番目のクエリが必要になります。

すべては、*定義された順序の郵便番号*を含むクエリ/ビューを作成することを前提としています。これをフィルタリングすると、(a)「現在の行」を定義し、より小さな行ですべてをフィルタリングするために使用されます。

ただし、最初に手動で注文する必要があります。

于 2012-05-06T07:09:23.790 に答える