【发布时间】:2020-10-28 17:50:10
【问题描述】:
我有两个相关的表(没有列出不必要的列):
LOCATION
VENUE_ID - NUMBER(38,0)
VISIT
ID - NUMBER(38,0)
VENUE_ID - NUMBER(38,0)
DEVICE_ID - VARCHAR(16777216)
这些表是相关的,因此访问与通过VENUE_ID 的位置相关联。
我正在尝试按位置获取唯一设备 ID 的计数,因此我编写了以下查询:
SELECT "d"."VENUE_ID"
, (
SELECT COUNT(*)
FROM (
SELECT DISTINCT "f0"."DEVICE_ID"
FROM "MAIN"."VISIT" AS "f0"
WHERE "d"."VENUE_ID" = "f0"."VENUE_ID"
) AS "t")
FROM "MAIN"."LOCATION" AS "d"
不幸的是,这个查询导致了神秘错误SQL compilation error: Unsupported subquery type cannot be evaluated。
通过一些实验,我发现我可以让查询返回而不会出错,但前提是我在 SELECT 中的现有子查询之前添加了一个额外的(无用的)子查询:
SELECT "d"."VENUE_ID"
-- New Useless Subquery
, (
SELECT COUNT(*)
FROM "MAIN"."VISIT" AS "f"
WHERE "d"."VENUE_ID" = "f"."VENUE_ID")
--
, (
SELECT COUNT(*)
FROM (
SELECT DISTINCT "f0"."DEVICE_ID"
FROM "MAIN"."VISIT" AS "f0"
WHERE "d"."VENUE_ID" = "f0"."VENUE_ID"
) AS "t")
FROM "MAIN"."LOCATION" AS "d"
如果我将新的子查询移动到 select after 不同的子查询中的任何位置,则会返回错误。我已经查看了the documentation on subqueries in Snowflake,要么我不明白这如何适用于我的查询,要么我面临着无证行为。有人知道这里发生了什么吗?
【问题讨论】:
-
你可以通过使用 LEFT JOIN
SELECT "d"."VENUE_ID", COUNT(DISTINCT "f0"."DEVICE_ID") FROM "MAIN"."LOCATION" AS "d" LEFT JOIN "MAIN"."VISIT" AS "f0" ON "d"."VENUE_ID" = "f0"."VENUE_ID" GROUP BY "d"."VENUE_ID"来避免相关的子队列,虽然很有趣 -
它类似于scenario I've encountered。重写查询很容易(我想大多数答案都会集中在这个上面)。我也很好奇优化器允许一个查询并禁止另一个查询的确切规则是什么。
-
这是我面临的问题的一个很好的解决方案,但就像我在 OP 中所说的那样,我已经有办法检索我需要的数据。我正在寻找关于正在发生的事情的解释,而不是针对我的特定要求的解决方案。这是我发现的 Snowflake 中的错误吗?
标签: snowflake-cloud-data-platform