Подзапрос в предложении выбора Снежинки не оценивает строку за строкой? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь написать очень простой запрос: я хочу получить все учетные записи в таблице снежинок и пометить учетные записи (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 различных идентификаторов учетных записей, но поле с именем «startup» содержит TRUE для каждой учетной записи.Я попытался диагностировать, почему это возвращает все Правда без удачи.Я также попытался написать этот же запрос, используя EXISTS с коррелированным подзапросом, и получил те же результаты.

Мне удалось создать рабочий запрос, по сути, оставив присоединение к подзапросу после предложения FROM, но я хотел быпонять, почему приведенный выше запрос не может быть правильно оценен для каждой строки.

Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я не могу воспроизвести поведение, которое вы видите:

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
0 голосов
/ 24 сентября 2019

было бы интересно увидеть результаты этих двух запросов:

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
...