Sql 基于上一个查询,在一个查询中进行多个选择 请考虑以下
MS SQL Server 2008架构设置: 问题1: : 问题: -如何在同一查询中基于GroupProductRelationSorting选择下一行 我想输出的结果应该是:Sql 基于上一个查询,在一个查询中进行多个选择 请考虑以下,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,MS SQL Server 2008架构设置: 问题1: : 问题: -如何在同一查询中基于GroupProductRelationSorting选择下一行 我想输出的结果应该是: | GROUPPRODUCTRELATIONPRODUCTID | GROUPPRODUCTRELATIONSORTING | |-------------------------------|-----------------------------| | OneProd
| GROUPPRODUCTRELATIONPRODUCTID | GROUPPRODUCTRELATIONSORTING |
|-------------------------------|-----------------------------|
| OneProd | 4 |
我知道我可以做这样的事情:
WITH Temp AS
(
SELECT
GroupProductRelationSorting
FROM
EcomGroupProductRelation
WHERE
GroupProductRelationProductID = 'Another' /* returns 3*/
)
SELECT
*
FROM
EcomGroupProductRelation
WHERE
GroupProductRelationSorting=Temp+1
但我似乎不知道该怎么做?试试这个
WITH cte AS (
SELECT
GroupProductRelationSorting,
GroupProductRelationProductID,
ROW_NUMBER() OVER (ORDER BY GroupProductRelationSorting) rw
FROM EcomGroupProductRelation
)
SELECT
c2.*
FROM cte c1
JOIN cte c2 ON c1.rw = c2.rw-1
WHERE c1.GroupProductRelationProductID = 'Another'
小提琴手:你几乎写下了答案。 你只需要修改一下你的代码 由此:
SELECT * FROM EcomGroupProductRelation WHERE GroupProductRelationSorting=Temp+1
对此
SELECT * FROM EcomGroupProductRelation WHERE GroupProductRelationSorting=(SELECT GroupProductRelationSorting FROM Temp)+ 1
您给出了表,但需要给出标量值
或者,您可以先将select值放入变量,然后对其进行过滤:
DECLARE @Temp INT = 0
SELECT @Temp = GroupProductRelationSorting
FROM EcomGroupProductRelation
WHERE GroupProductRelationProductID = 'Another' /* returns 3*/
SELECT * FROM EcomGroupProductRelation WHERE GroupProductRelationSorting=@Temp+1
或
伟大的第一个答案有效。我不能让第二个去工作。。但是谢谢:如果我把所有的衣服都脱光,这就行了。他们为什么在那里Thanksi刚刚使用了table变量@table来避免在我的数据库中创建对象或临时表..好的,这很有意义:谢谢
SELECT * FROM EcomGroupProductRelation WHERE GroupProductRelationSorting=Temp+1
SELECT * FROM EcomGroupProductRelation WHERE GroupProductRelationSorting=(SELECT GroupProductRelationSorting FROM Temp)+ 1
DECLARE @Temp INT = 0
SELECT @Temp = GroupProductRelationSorting
FROM EcomGroupProductRelation
WHERE GroupProductRelationProductID = 'Another' /* returns 3*/
SELECT * FROM EcomGroupProductRelation WHERE GroupProductRelationSorting=@Temp+1
Declare @EcomGroupProductRelation TABLE
(
GroupProductRelationProductID varchar(255),
GroupProductRelationSorting int
);
INSERT INTO @EcomGroupProductRelation
( GroupProductRelationProductID,
GroupProductRelationSorting
)
VALUES
('OneProd', 4),
('Another', 3),
('OneMore', 2),
('LastProd', 1);
SELECT TOP 1 *
FROM (SELECT TOP 2 *
FROM @EcomGroupProductRelation
WHERE GroupProductRelationSorting >= 3
ORDER BY GroupProductRelationSorting) T
ORDER BY GroupProductRelationProductID DESC
;WITH Temp AS
(
SELECT GroupProductRelationProductID,
ROW_NUMBER()OVER(ORDER BY GroupProductRelationSorting )AS Rn
FROM
@EcomGroupProductRelation
)
SELECT P.GroupProductRelationProductID
FROM Temp P
LEFT JOIN Temp T ON P.RN = T.Rn + 1
WHERE T.GroupProductRelationProductID = 'Another'