簡體   English   中英

如果在多項選擇語句中其他

[英]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。 不幸的是,由於ProductActive0 ,因此該產品無效。

題:
我需要以前的產品,但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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM