SQL выражений, которые должны быть эквивалентны, но не являются? - PullRequest
0 голосов
/ 17 марта 2020

У нас есть проблема, когда нам нужно объединить данные между несколькими таблицами в качестве фильтров для набора пользователей. Подзапросы дают мне тот же результат, когда я использую только одно условие как «простой» запрос только с одним условием, но когда я использую несколько подзапросов, я получаю что-то намного выше, как будто это не фильтрация и выполнение операции AND, как Я бы ожидал. На простом воссоздании я проверил, что результаты двух подзапросов и их «простой» эквивалент идентичны - поэтому с моей стороны это какая-то синтаксическая ошибка в том, как я проверяю user_id в двух подзапросах.

Какой синтаксический сахар мне не хватает, чтобы использовать два подзапроса вместе, как обычный фильтр AND, чтобы во втором примере я получил 32, как я и ожидал? Если он указан c для программного обеспечения, я делаю этот запрос к базе данных AWS Snowflake.

"Правильный" запрос может быть выполнен для одной таблицы, например:

Ex. 1: Это дает мне 32:

SELECT COUNT(DISTINCT table_a.user_id)
FROM   table_a 
WHERE  cond_1 AND cond_2

Пример. 2: Это дает мне 104:

SELECT Count(DISTINCT table_b.user_id ) 
FROM   table_b 
WHERE ( 
    table_b.user_id IN (SELECT table_a.user_id FROM table_a WHERE cond_1)
    AND 
    table_b.user_id IN (SELECT table_a.user_id FROM table_a WHERE cond_2)
)

ПРИМЕЧАНИЕ Для контекста я проверил, что подзапросы работают и дают те же данные, что и простые условия WHERE:

дает мне результат 25:

SELECT COUNT(DISTINCT table_a.user_id)
FROM   table_a 
WHERE  cond_1

дает мне результат 25:

SELECT Count(DISTINCT table_b.user_id )
FROM   table_b 
WHERE ( 
    table_b.user_id IN (SELECT table_a.user_id FROM table_a WHERE cond_1)
)

дает мне результат 48:

SELECT COUNT(DISTINCT table_a.user_id)
FROM   table_a 
WHERE  cond_2

дает мне результат 48:

SELECT Count(DISTINCT table_b.user_id )
FROM   table_b 
WHERE ( 
    table_b.user_id IN (SELECT table_a.user_id FROM table_a WHERE cond_2)
)

Ответы [ 2 ]

4 голосов
/ 17 марта 2020

Я не вижу связи между:

WHERE  cond_1 AND cond_2

и:

WHERE (table_b.user_id IN (SELECT table_a.user_id FROM table_a WHERE cond_1) AND 
      table_b.user_id IN (SELECT table_a.user_id FROM table_a WHERE cond_2)

Первая версия требует выполнения условий в той же строке в table_a. Второй требует, чтобы user_id удовлетворял условиям, но они могут быть в разных строках в a.

0 голосов
/ 18 марта 2020

Это также не имеет смысла

SELECT COUNT(DISTINCT table_a.user_id)
FROM   table_a 
WHERE  cond_1 AND cond_2

дает вам 32

SELECT COUNT(DISTINCT table_a.user_id)
FROM   table_a 
WHERE  cond_1

, а менее ограниченный набор из той же таблицы дает 25

...