У меня есть эти простые таблицы:
1. USER_DND
╔════════╦══════╗
║ UserID ║ DnD ║
╠════════╬══════╣
╚════════╩══════╝
2. USER_FRIEND
╔════════╦══════════╗
║ UserID ║ FriendID ║
╠════════╬══════════╣
╚════════╩══════════╝
USER_DND
: Содержит идентификаторы пользователей и их флаг "Не беспокоить" (Dnd). UserID
является целым числом и является первичным ключом. DnD
является логическим.
USER_FRIEND
: Содержит идентификаторы друзей пользователей. UserID
и FriendID
оба являются целыми числами.
Проблема:
Для данных UserID
и FriendID
я хочу написать одиночный запрос, возвращающий логическое значение (SELECT CASE WHEN EXISTS
), которое возвращает true в любом из случаев:
Если заданный UserID имеет DnD
значение false в USER_DND
OR
Если заданный UserID имеет DnD
значение true в USER_DND
и данный FriendID существует в USER_FRIEND
для этого UserID
Дополнительно:
Эти две таблицы с большим количеством строк. Запрос должен быть очень быстрым. Поэтому я не предпочитаю использовать OR
в предложении where запроса или запрос с подзапросами. Оба имеют серьезные штрафы за производительность.
FriendID
существует только вUSER_FRIEND
, так как же этого не может быть? - person sagi   schedule 26.06.2016SHOW CREATE TABLE
для них? Ключом к производительности являются индексы. - person tadman   schedule 26.06.2016UserId, FriendID
? Это очень важно при выполненииJOIN
. Вот почему добавление схемы ваших таблиц, даже репрезентативной версии, очень важно, а диаграммы не очень помогают. - person tadman   schedule 26.06.2016