Я был осведомлен об этом вопросе от автора этого связанного , который был убежден, что его проблема не может быть решена после прочтения здесь.Ну, это возможно.
Этому ответу почти два года, но последние вопросы еще не получены.
Запрос
Возможно линапишите проще или это лучшее решение?
Чтобы проверить одиночный идентификатор , найденный вами запрос хорош.Вы можете упростить:
SELECT coalesce((SELECT count(candidate_id)
FROM "Applications" WHERE candidate_id = _SOME_ID_), 0) AS c;
Условие WHERE
ограничивается одним candidate_id
, и в списке SELECT
есть одна агрегатная функция.GROUP BY candidate_id
был избыточен.
Псевдоним столбца был проглочен на COALESCE()
.Если вы хотите назвать получившийся столбец, переместите псевдоним в конец.
- Вам не нужны двойные кавычки для обычного идентификатора в нижнем регистре.
Другой, более чистый(IMHO) форма будет использовать LEFT JOIN
:
SELECT count(a.candidate_id) AS c
FROM (SELECT _SOME_ID_ AS candidate_id) x
LEFT JOIN "Applicaions" a USING (candidate_id)
Это хорошо работает для нескольких идентификаторов , также:
WITH x(candidate_id) AS (
VALUES
(123::bigint)
,(345)
,(789)
)
SELECT x.candidate_id, count(a.candidate_id) AS c
FROM x
LEFT JOIN "Applicaions" a USING (candidate_id)
GROUP BY x.candidate_id;
LEFT JOIN
обычно быстрее для длинного списка, чем несколько предложений WHERE
или выражение IN
.
Или, для всех строк в таблице «Кандидаты»:
SELECT x.candidate_id, count(a.candidate_id) AS c
FROM "Candidates" x
LEFT JOIN "Applications" a USING (candidate_id)
GROUP BY x.candidate_id;
Индексы
Стоит ли создавать какие-либо индексы?
Если важна производительность чтения и таблица содержит больше, чем простопара строк, которым вы определенно нуждаетесь в индексе вида:
CREATE INDEX foo_idx ON "Applications" (candidate_id);
Поскольку это столбец внешнего ключа, ссылающийся на "Candidates".candidate_id
, вам, скорее всего, нужно, чтобы это началосьс.