基于条件多列条件的最佳过滤

时间:2020-12-26 12:53:49

标签: sql filtering query-optimization teradata

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

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

    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)

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

1 个答案:

答案 0 :(得分:1)

假设所有 AND ed 表达式都具有相同的列,那么大多数数据库都会很好地处理您的查询。他们会在 (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;

您希望此查询具有相同(或相似)的索引。

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