选择具有不同条件的行,同时所有行共享相同的键列

时间:2017-02-20 12:31:36

标签: sql

我已经有了一个有效的解决方案,但我正在寻找一种更快或更好的方法。

key column | fruit | quantity
------------------------------
11111       apple       100
11111       melon        50
11111       banana       75
22222       apple       200
22222       cherry      100
22222       banana       10
33333       apple        90
33333       melon        60
33333       lemon       200

我想看看哪个关键栏目的水果'和'数量'满足我的条件。

我的解决方案:

SELECT 
    a1.[key column]
FROM
    products a1,
    products a2,
    products a3
WHERE
    (a1.fruit = 'apple' and a1.quantity > 95) and
    (a2.fruit = 'melon' and a2.quantity > 40) and
    (a3.fruit = 'banana' and a3.quantity > 60) and
    (a1.[key column] = a2.[key column]) and 
    (a1.[key column] = a3.[key column])

当所有条件都满足时,它们都共享相同的[关键列],结果将是:11111

如果我理解正确的话,我所做的就是加入同一张桌子3x。它已经很快了,但是这个表包含500k行,我希望有更多的条件。如果我有10个条件,我不确定加入同一个表10次是多么聪明。

2 个答案:

答案 0 :(得分:1)

一种简单方法使用group byhaving

SELECT p.[key column]
FROM products p
WHERE (p.fruit = 'apple' and p.quantity > 95) or
      (p.fruit = 'melon' and p.quantity > 40) or
      (p.fruit = 'banana' and p.quantity > 60)
GROUP BY p.[key column]
HAVING COUNT(DISTINCT fruit) = 3;

这是否更快,您的方法取决于数据库,数据大小和索引。但是,这种方法在性能上是一致的。 。 。因此添加更多条件对性能几乎没有影响。

答案 1 :(得分:1)

我认为你不需要加入。试试这个

SELECT DISTINCT [key column]
FROM
products 
WHERE quantity > CASE fruit WHEN 'apple' THEN 95
                 WHEN 'melon' THEN 40 
                 WHEN 'banana' THEN 60 END