SQL 应该等价的表达式,但不是?
SQL expressions that should be equivalent, but aren't?
我们遇到了一个问题,我们需要跨多个 table 加入数据作为一组用户的过滤器。当仅使用一个条件时,子查询给我的结果与仅使用一个条件的 "simple" 查询的结果相同,但是当我使用多个子查询时,我得到的结果更高,就像它没有过滤并执行 AND像我预期的那样操作。我在一个简单的娱乐中验证了两个子查询的结果和它们的 "simple" 等价物是相同的——所以我在检查两个子查询中的 user_id 时出现了一些语法错误子查询。
为了让第二个示例像我期望的那样将两个子查询一起使用,我缺少什么语法糖?如果它特定于软件,我将在 AWS Snowflake 数据库上执行此查询。
"correct" 查询可以在单个 table 上完成,如下所示:
例如。 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)
)
我认为两者之间没有关系:
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
.
中可以不同行
这也说不通
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
和来自相同 table 的较少约束集给出 25
我们遇到了一个问题,我们需要跨多个 table 加入数据作为一组用户的过滤器。当仅使用一个条件时,子查询给我的结果与仅使用一个条件的 "simple" 查询的结果相同,但是当我使用多个子查询时,我得到的结果更高,就像它没有过滤并执行 AND像我预期的那样操作。我在一个简单的娱乐中验证了两个子查询的结果和它们的 "simple" 等价物是相同的——所以我在检查两个子查询中的 user_id 时出现了一些语法错误子查询。
为了让第二个示例像我期望的那样将两个子查询一起使用,我缺少什么语法糖?如果它特定于软件,我将在 AWS Snowflake 数据库上执行此查询。
"correct" 查询可以在单个 table 上完成,如下所示:
例如。 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)
)
我认为两者之间没有关系:
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
.
这也说不通
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
和来自相同 table 的较少约束集给出 25