[英]If Else in Multiple Select Statement
請考慮以下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
是該ProductActive
處於活動狀態( ProductActive
列中為1)。
如果未激活,則應選擇前一個。 是否可以在單個查詢中這樣做?
如果您僅需要一個給定產品的先前產品,則可以使用如下查詢:
select TOP 1 p.ProductID
from EcomGroupProductRelation pr join
EcomProducts p
on p.ProductID = pr.GroupProductRelationProductID
where p.ProductActive = 1 and
pr.GroupProductRelationSorting < (select GroupProductRelationSorting
from EcomGroupProductRelation pr2
where pr2.GroupProductRelationProductID = 7
)
order by pr.GroupProductRelationSorting desc;
注意:如果沒有產品,則此查詢不返回任何行。
如果您過濾掉無效的產品,那么從某種意義上講,您將需要對“排序”列進行重新排序,以確定要添加的列。 可以通過ROW_NUMBER()
函數完成此操作,如下所示:
WITH Temp AS
(
SELECT GroupProductRelationSorting
FROM EcomGroupProductRelation
WHERE GroupProductRelationProductID = 'PROD7'
)
SELECT GroupProductRelationProductID
FROM
(
SELECT
GroupProductRelationProductID,
ROW_NUMBER() OVER (PARTITION BY GroupProductRelationGroupID ORDER BY GroupProductRelationSorting DESC) AS RN
FROM
EcomGroupProductRelation
INNER JOIN
EcomProducts ON
GroupProductRelationProductID = ProductID
WHERE
ProductActive = 1 AND
GroupProductRelationSorting < (SELECT GroupProductRelationSorting FROM Temp)
) x
WHERE RN = 1
為“下一個產品”執行此操作將涉及更改兩個條件:反轉RN
字段的排序順序,並更改WHERE
子句以僅顯示大於Temp
值的記錄。
WITH Temp AS
(
SELECT GroupProductRelationSorting
FROM EcomGroupProductRelation
WHERE GroupProductRelationProductID = 'PROD7'
)
SELECT GroupProductRelationProductID
FROM
(
SELECT
GroupProductRelationProductID,
ROW_NUMBER() OVER (PARTITION BY GroupProductRelationGroupID ORDER BY GroupProductRelationSorting) AS RN
FROM
EcomGroupProductRelation
INNER JOIN
EcomProducts ON
GroupProductRelationProductID = ProductID
WHERE
ProductActive = 1 AND
GroupProductRelationSorting > (SELECT GroupProductRelationSorting FROM Temp)
) x
WHERE RN = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.