2012-05-06 85 views
3

我是SQL新手,所以我需要您對查詢的幫助。基本上我有一個ZipCodes的數據庫,我想在選定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部分)產生的編號序列:

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中完成。第二部分只是一個查詢來獲取數據。

要使查詢有效運行,請確保在ZipCode列上有索引。

0

3項和3項AFTE

SQL被設定爲主,它不具有確定的順序進行,除非定義了一個(具有爲了通過)。

現在,讓我們不要進入更復雜的東西 - FURST你必須創建一個請求中央項目的訂單,然後在第二個查詢中,你可以請求另一個6.對不起,沒有其他辦法。使用Top 4語句和過濾器等,x + 3將是可行的 - 但之前的3將肯定需要第二個查詢。

所有假設你克雷婭察查詢/視圖,其具有 *以定義的順序 的郵編*一旦過濾它,用於定義(a)中的「當前行」以及濾波器,用於所有具有較小的行數線。

但您首先需要手動訂購。

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 

認沽UNION ALL這兩者之間查詢使其成爲一個,如果這就是你想要的。

你可以在SQL Fiddle中使用它。

相關問題