SQL - 不等于运算符忽略了where子句的其余部分

时间:2015-01-28 16:06:00

标签: sql

product_id |value
1          | a
1          | b
1          | c
2          | a
2          | c
2          | d
3          | a
3          | c
3          | d

以下是我的代码,我想要实现的是检查哪个product_id都有' a'和' c' - 这部分工作正常。

我的问题是,当我执行以下操作时:

AND value != ('b')

它完全忽略了不等于运算符并仍然返回b ...

SELECT 
    product_id, value
FROM
          table
WHERE
    value = 'a'
    OR value = 'c'
    AND value != ('b')
GROUP BY product_id
HAVING count(value) = 2
order by product_id

我想我的问题是如何修复它,为什么会发生这种情况?非常感谢您的宝贵时间。 :)

编辑: 我应该做的是:

product_id  value
2   a
3   a

2 个答案:

答案 0 :(得分:0)

where子句添加正确的括号。现在,在value='C' and value<>'b'

之间应用了And运算符
SELECT 
    product_id, value
FROM
          table
WHERE
    (value = 'a'
    OR value = 'c')
    AND value != ('b')
GROUP BY product_id
HAVING count(value) = 2
order by product_id

更新::看起来修复括号不会解决您的问题。在conditional count子句中使用having来过滤组。

SELECT product_id,
       min(value) value
FROM   table
GROUP  BY product_id
HAVING Count(CASE WHEN value = 'a' THEN 1 END) = 1
       AND Count(CASE WHEN value = 'c' THEN 1 END) = 1
       AND Sum(CASE WHEN value <> 'b' THEN 0 ELSE 1 END) = 0 

答案 1 :(得分:0)

操作顺序。

value = 'a' OR value = 'c' AND value <> ('b')

将评估与

相同
value = 'a' OR (value = 'c' AND value <> ('b'))

将条件(WHERE)子句更改为

(value = 'a' OR value = 'c') AND value <> ('b')