【发布时间】:2015-08-27 11:38:38
【问题描述】:
请考虑以下 SQL 架构和语句。 http://sqlfiddle.com/#!3/06c46/1/0
表格:
CREATE TABLE EcomGroupProductRelation
(
GroupProductRelationGroupID varchar(10),
GroupProductRelationProductID varchar(10),
GroupProductRelationSorting int
);
INSERT INTO EcomGroupProductRelation
(
GroupProductRelationGroupID,
GroupProductRelationProductID,
GroupProductRelationSorting
)
VALUES
('GROUP1', 'PROD3', 0),
('GROUP1', 'PROD7', 1),
('GROUP1', 'PROD2', 2),
('GROUP1', 'PROD4', 3),
('GROUP1', 'PROD6', 5),
('GROUP1', 'PROD8', 6),
('GROUP1', 'PROD10', 7);
CREATE TABLE EcomProducts
(
ProductID varchar(10),
ProductName varchar(255),
ProductActive int,
ProductAutoID int Primary Key
);
INSERT INTO EcomProducts
(
ProductID,
ProductName,
ProductActive,
ProductAutoID
)
VALUES
('PROD2', 'My 2. prod', 1, 2),
('PROD3', 'My 3. prod', 0, 3),
('PROD4', 'My 4. prod', 1, 4),
('PROD5', 'My 5. prod', 1, 5),
('PROD6', 'My 6. prod', 1, 6),
('PROD7', 'My 7. prod', 1, 7),
('PROD8', 'My 8. prod', 1, 8),
('PROD9', 'My 9. prod', 1, 9),
('PROD10', 'My 10. prod', 1, 10);
声明:
WITH Temp AS
(
SELECT
GroupProductRelationSorting
FROM
EcomGroupProductRelation
WHERE
GroupProductRelationProductID = 'PROD7'
)
SELECT
GroupProductRelationProductID
FROM
EcomGroupProductRelation
WHERE
GroupProductRelationSorting=
(
SELECT
GroupProductRelationSorting
FROM
Temp
)-1
在我的示例中,我获得了 PROD7 之前的产品,即 PROD3。不幸的是,由于ProductActive 中的0,此产品未激活。
问题:
我需要以前的产品,但前提是它处于活动状态(ProductActive 列中的 1)。
如果它未激活,则应选择该前一个。
是否可以在单个查询中执行此操作?
【问题讨论】:
-
如果最后 2 个产品没有激活,应该怎么办?您是否应该返回直到找到最后一个有效产品?
-
Temp 永远不会包含超过 1 行吗?
-
@jarlh 是的,总是一行
标签: sql sql-server-2008