2012-05-06 98 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中使用它。

相关问题