我是SQL的新手,所以我需要你的查询帮助。基本上我有一个ZipCodes数据库,我希望在选定的ZipCode和之后的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')
我从某处获取了一个示例查询,并成功转换它供我使用。唯一的问题是此Query返回当前项和下一项。相反,它应该返回前3项,当前项和后三项。
答案 0 :(得分: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
列上有索引。
答案 1 :(得分: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。
中使用它答案 2 :(得分:0)
所选ZipCode之前的3个项目和之后的3个项目
SQL是基于设置的,它没有已定义的顺序,除非您定义一个(按顺序)。
现在,让我们不要进入更复杂的东西 - FURST你必须创建一个要求中心项目的订单,然后在第二个查询中你可以要求另一个6.对不起,别的方式。使用前4个语句和过滤器等可以使用x + 3 - 但之前的3个肯定需要第二个查询。
所有假设你有creata查询/视图 *按定义的顺序zipCodes *过滤后的行号,用于定义(a)“当前行”以及过滤所有较小行的行。
但您首先需要手动订购。