Выполняет ли использование запроса внутри оператора select этот запрос для каждой строки? - PullRequest
0 голосов
/ 06 апреля 2020

Использование Postgres Я написал следующий запрос:

SELECT 
    *,
    CASE 
        WHEN
            (SELECT count(*) FROM applications WHERE applications.user_id = 774 AND applications.job_id = jobs.id) > 0
        THEN 1 
        ELSE 0 
    END 
    AS has_applied 
FROM jobs

Он выбирает все задания из моей базы данных и запускает проверку, чтобы увидеть, вошел ли пользователь, вошедший в данный момент (с идентификатором 774 в данном случае) применимо к заданию.

Я вижу только один запрос, выполненный в моей базе данных GUI, но для этого не нужно запускать вложенный запрос для каждой строки из таблицы jobs ?

Есть ли лучший способ написать это? Или это похоже на то, что должно быть сделано путем сравнения наборов данных из двух отдельных запросов?

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Вы можете просто сделать LEFT JOIN:

SELECT j.*, (CASE WHEN a.job_id IS NULL THEN 0 ELSE 1 END) AS has_applied
FROM jobs j LEFT JOIN
     applications a
     ON a.job_id = j.id AND a.user_id = 774;
1 голос
/ 06 апреля 2020

Вы можете написать это, используя левое соединение:

SELECT
    j.*,
    CASE WHEN COUNT(CASE WHEN a.user_id = 774 THEN 1 END) > 0
         THEN 1 ELSE 0 END AS has_applied
FROM jobs j
LEFT JOIN applications a
    ON j.id = a.job_id
GROUP BY
    j.id;

Обратите внимание, что приведенный выше синтаксис GROUP BY действительно действителен для Postgres, предполагая, что jobs.id будет первичным ключом этой таблицы. В этом случае jobs.* - это столбцы, которые функционально зависят от jobs.id.

0 голосов
/ 06 апреля 2020

I настоятельно рекомендуем использовать EXISTS. Вы можете просто вернуть значение как логическое значение в Postgres, поэтому:

SELECT j.*,
       (EXISTS (SELECT 1
                FROM applications a
                WHERE a.job_id = j.id AND a.user_id = 774 
       ) as has_applied
FROM jobs j;

При индексе applications(job_id, user_id) не должно быть более быстрого способа обработки запроса.

...