#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’