繁体   English   中英

SQL查询重写以美化和/或提高性能

[英]SQL query rewrite for prettification and or performance improvement

我有一个查询,基本上等于:

  Select query 1
Union
  Select query 2
  where rowid not in query 1 rowids

有没有更漂亮/更高效的方式来做到这一点? 我假设查询1的结果将被缓存并因此在联合中使用...但这也有点麻烦。

使用原始查询更新:

    SELECT FruitType
    , count(CASE WHEN Status = 0 THEN 1 ELSE 0 END) AS Fresh
    , count(CASE WHEN Status = 1 THEN 1 ELSE 0 END) AS Ripe
    , count(CASE WHEN Status = 2 THEN 1 ELSE 0 END) AS Moldy
    FROM FruitTypes FT1
    LEfT  JOIN Fruits F on F.FTID = FT1.ID
    where 
      Fruit.IsHighPriced = 0
    GROUP BY FruitType
Union ALL
    select FruitType, 0 as Fresh, 0 as Ripe, 0 as Moldy
    FROM FruitTypes ft3
    where 
      ft3.StoreID = @PassedInStoreID
    and FruitType NOT IN 
    (
        SELECT FruitType
        , count(CASE WHEN Status = 0 THEN 1 ELSE 0 END) AS Fresh
        , count(CASE WHEN Status = 1 THEN 1 ELSE 0 END) AS Ripe
        , count(CASE WHEN Status = 2 THEN 1 ELSE 0 END) AS Moldy
        FROM FruitTypes FT2
        LEfT  JOIN Fruits F on F.FTID = FT2.ID
        where 
          Fruit.IsHighPriced = 0
        GROUP BY FruitType
    )

谢谢!

您在NOT in子句中不需要第二个case语句。 在SQL Server中,不存在通常更快。

 SELECT FruitType
        , count(CASE WHEN Status = 0 THEN 1 ELSE 0 END) AS Fresh
        , count(CASE WHEN Status = 1 THEN 1 ELSE 0 END) AS Ripe
        , count(CASE WHEN Status = 2 THEN 1 ELSE 0 END) AS Moldy
        FROM FruitTypes FT1
        LEfT  JOIN Fruits F on F.FTID = FT1.ID
        where 
          Fruit.IsHighPriced = 0
        GROUP BY FruitType
    Union ALL
        select FruitType, 0 as Fresh, 0 as Ripe, 0 as Moldy
        FROM FruitTypes ft3
        where 
          ft3.StoreID = @PassedInStoreID
        and NOT EXISTS
        (
            SELECT *
            FROM FruitTypes FT2
            LEfT  JOIN Fruits F on F.FTID = FT2.ID
            where 
              Fruit.IsHighPriced = 0
              and ft3.FruitType = FT2.FruitType
                   )

最漂亮的编写方式可能是将查询1转换为视图或函数,然后使用该视图或函数调用重复代码。

通过使用查询#1填充临时表或表变量,然后使用该临时表代替可疑代码,可以提高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM