SQL Server В / ИЛИ точности / контексте

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть следующие столбцы в my_table:

customer_id, transaction_date, название магазина, transaction_id

Если я напишу:

 SELECT DISTINCT customer_id, COUNT(DISTINCT transaction_id) as transaction_count
FROM my_table
WHERE shop_name = 'A'
OR shop_name = 'B'
AND transaction_date > 'yyyy-mm-dd'
AND COUNT(DISTINCT transaction_id) > 2
  

Я получаю 100 записей

Если я напишу:

 SELECT DISTINCT customer_id, COUNT(DISTINCT transaction_id) as transaction_count
FROM my_table
WHERE shop_name IN ('A','B')
AND transaction_date > 'yyyy-mm-dd'
AND COUNT(DISTINCT transaction_id) > 2
  

Я получаю 50 записей

Почему разница в записях в этом контексте? Является ли IN (для shop_name) более точным, чем OR или наоборот?

Спасибо.

Комментарии:

1. В запросе отсутствует GROUP BY предложение или это не MS SQL Server (это приведет к ошибке)

Ответ №1:

Если вам нужен тот же результат, the OR condition что IN operator и для, тогда вам нужно поместить свой OR condition в скобки —

 SELECT DISTINCT customer_id, COUNT(DISTINCT transaction_id) as transaction_count
FROM my_table
WHERE (shop_name = 'A'
OR shop_name = 'B')
AND transaction_date > 'yyyy-mm-dd'
AND COUNT(DISTINCT transaction_id) > 2
  

Комментарии:

1. Спасибо @Fahmi, но что он делает, когда я не добавляю скобки, кажется, что результаты все еще как-то точны?

2. @nleiserowitz, это должен быть тот же результат — он будет отличаться. К счастью, вы попадаете в этот случай — но это не будет одинаково для всех случаев.

Ответ №2:

Запрос

 SELECT DISTINCT customer_id, COUNT(DISTINCT transaction_id) as transaction_count
FROM my_table
WHERE shop_name = 'A'
OR shop_name = 'B'
AND transaction_date > 'yyyy-mm-dd'
AND COUNT(DISTINCT transaction_id) > 2
  

эквивалентно:

 SELECT DISTINCT customer_id, COUNT(DISTINCT transaction_id) as transaction_count
FROM my_table
WHERE shop_name = 'A'
OR (shop_name = 'B'
    AND transaction_date > 'yyyy-mm-dd'
    AND COUNT(DISTINCT transaction_id) > 2)
  

Здесь дополнительные условия влияют только на shop_name = ‘B’