Запрос PostgreSQL для проверки ссылки на строку из нескольких таблиц - PullRequest
3 голосов
/ 10 июля 2019

У меня есть одна главная таблица A и две разные вложенные таблицы (B, C), на которые ссылается внешний ключ в таблице A, я хочу проверить, существует ли строка с внешним ключом fk-1 в таблицах B или C.

Я попытался выбрать строки из A с предложением Существует на B & C, которые были выбраны с помощью fk-1, далее ИЛИ вместе и нашел результат.

SELECT A.id FROM A where A.id = fk-1 AND
(
    EXISTS (select B.id from B where B.fk_1 = fk-1)
    OR EXISTS (select C.id from C where C.fk_1 = fk-1)
);

Можно ли это оптимизировать или есть ли лучшие способы сделать это.

Заранее спасибо.

1 Ответ

1 голос
/ 10 июля 2019

Для одной проверки, которая является самой быстрой, если вы проиндексировали A.id, B.fk_1 и C.fk_1

Распространенной ошибкой является вызов этого SQL для каждой строки, которую вы, возможно, захотите проверить. Проверка может быть намного быстрее, если все строки проверяются одновременно. (Быстрее для каждой строки проверено)

Так что, если вы хотите проверить их одновременно, вы можете сделать:

SELECT A.id FROM A WHERE A.id IN (
    SELECT B.fk_1 FROM B [WHERE xxx] 
    UNION SELECT C.fk_1 FROM C [WHERE xxx])

Используйте [WHERE xxx], чтобы поместить WHERE для фильтрации релевантных результатов, которые вы можете захотеть. Одной из рекомендуемых проверок будет «ГДЕ B.fk_1 НЕ НУЛЬ» для фильтрации записей без FK.

...