【问题标题】:If Else in Multiple Select Statement多选语句中的 If Else
【发布时间】: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


【解决方案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;

注意:如果没有产品,则此查询不返回任何行。

【讨论】:

  • 伟大的@GordonLinoff ! :) 谢谢!这很有道理。 GroupProductRelationProductID 应该是一个 varchar。但随后它会返回它应该返回的内容。我可以使用它,但不能完全回答所提出的问题。
  • @Crave 。 . .在那种情况下,我不明白这个问题。
  • 好的,有些问题,但不是全部 :) “如果它不是活动的,应该选择那个之前的那个。是否可以在单个查询中这样做?” ;)
  • 你能帮我买下一个产品——同样的款式吗?我已尝试进行您建议 ASC 的查询,但似乎没有返回正确的产品。
  • @Crave 。 . .如果您还有其他问题,则应将其作为问题提出。但是,我希望下一个产品只是 &lt;desc 的反转。
【解决方案2】:

如果您过滤掉不活跃的产品,那么从某种意义上说,您需要对排序列重新排序以确定要添加哪些列。这可以通过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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多