【问题标题】:Optimal filtering based on conditional multiple column criteria基于条件多列标准的最佳过滤
【发布时间】:2021-04-03 23:36:57
【问题描述】:

我需要根据条件条件过滤查询。看起来很简单,我只是在寻找优化查询的想法

我需要根据季节、国家和产品过滤价格。所以查询或多或少会像:

    SELECT Country, Season, Product, Price
FROM Table
WHERE (Country = 'UK' AND Season = 'High' AND Product = 'X' AND Price < 30)
OR
(Country = 'ES' AND Season = 'Low' AND Product = 'Y' AND Price < 25)
OR 
(Country = 'FR' AND Season = 'Mid' AND Product = 'Z' AND Price < 50)

等等。问题是组合的数量是巨大的,这将使这不切实际。欢迎任何想法

【问题讨论】:

  • 如果过滤器组合的数量很大,您可以将它们存储在另一个表中吗?在这种情况下,一个简单的连接就可以解决问题。
  • 好点。就我而言,这并不简单,但所有事情都认为它可能是最好的解决方案
  • 用您正在使用的数据库标记您的问题。

标签: sql filtering query-optimization teradata


【解决方案1】:

假设您所有的ANDed 表达式都有相同的列,那么大多数数据库都会很好地处理您的查询。他们会在 (Country, Season, Product, Price).

上使用索引

如果你有这样的索引并且没有重叠的条件,你也可以将逻辑表述为:

SELECT Country, Season, Product, Price
FROM Table
WHERE Country = 'UK' AND Season = 'High' AND Product = 'X' AND Price < 30
UNION ALL
SELECT Country, Season, Product, Price
FROM Table
WHERE Country = 'ES' AND Season = 'Low' AND Product = 'Y' AND Price < 25
UNION ALL
. . .

这更灵活。如果不是所有条件都完全相同,这仍然可以使用索引进行查询。

您也可以使用JOIN 来表达这一点。在查询中,您可以创建派生表:

SELECT Country, Season, Product, Price
FROM (VALUES ('UK', 'High', 'X', 20),
             ('ES', 'LOW', 'Y', 25),
             . . . 
     ) v(Country, Season, Product, Price) JOIN
     Table t
     ON t.country = v.country AND
        t.season = v.season AND
        t.product = v.product AND
        t.price < v.price;

您希望该查询使用相同(或相似)的索引。

当然,您可以将值存储在单独的表中。

【讨论】:

  • 我认为没有 OR 会做得更好。会尝试一下,看看它的表现如何。谢谢
猜你喜欢
  • 1970-01-01
  • 2022-07-21
  • 2021-12-14
  • 2021-09-24
  • 2021-07-15
  • 2019-09-10
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多