我正在尝试编写一个非常简单的查询:我想提取雪花表中的所有帐户,并在类型字段中标记可以链接到商机表中记录的帐户(True/False(。
这是一个我认为会返回我正在寻找的内容的查询:
SELECT
acc.id
, acc.id IN (
SELECT DISTINCT(opp.accountid)
FROM "OPPORTUNITY" opp
WHERE opp.type LIKE '%Startup%'
) AS startup
FROM "ACCOUNT" acc
帐户表具有 ~100,000条不同的记录,子查询仅返回包含 ~11,000 个不同帐户 ID 的列表,但别名为"startup"的字段包含每个帐户的 TRUE。我尝试诊断为什么这会返回所有 True,但没有运气。我还尝试使用带有相关子查询的 EXISTS 编写相同的查询,并得到了相同的结果。
我能够通过基本上在 FROM 子句之后加入子查询来构建一个工作查询,但我很想了解为什么上面的查询无法正确计算每一行。
任何帮助将不胜感激。谢谢!
我无法重现您看到的行为:
create or replace table ACCOUNT(id int);
insert into ACCOUNT values (1), (2), (3);
create or replace table OPPORTUNITY(accountid int, type varchar);
insert into OPPORTUNITY values (1, 'Startup'), (2, 'Startup');
运行上面的查询,然后生成结果:
Row ID STARTUP
1 1 TRUE
2 2 TRUE
3 3 FALSE
我们看看这两个查询的结果会很有趣:
SELECT COUNT(DISTINCT accountid)
FROM opportunity
WHERE type LIKE '%Startup%';
SELECT COUNT(DISTINCT accountid)
FROM opportunity
WHERE type iLike '%Startup%';
我认为像下面这样的事情可能是你的最终目标:
SELECT acc.id,
startup.accountid
FROM ACCOUNT acc
LEFT OUTER JOIN (
SELECT COUNT(DISTINCT accountid) as accountid
FROM opportunity
WHERE type iLike '%Startup%'
AND accountid IS NOT NULL) startup
ON acc.id = startup.accountid;
开始附加信息****
看完评论后,我决定多玩一下,果然我的测试有效,也许你有空值或类似的弄乱你的数据或结果? 我不确定,但这对我有用!
create table account (id varchar);
insert into account values ('A'), ('B'),('C'),('D');
create table opportunity (accountid varchar, type varchar);
insert into opportunity values ('D', 'New Subscription'), ('X', 'Stuff'), ('Y', 'Stuff'), ('Z', 'Stuff');
select account.id,
account.id in (select distinct accountid FROM opportunity WHERE type like '%Subscr%') as startup
FROM account;
ID STARTUP
A FALSE
B FALSE
C FALSE
D TRUE