Я нахожусь на оракуле DB. Позволяет говорят, что у меня есть одно представление, которое соединяет с тремя таблицами. Представление имеет два поля каждый. Каждому полю только нужны данные из двух из этих трех таблиц.
Если я запрашиваю представление и возвращаю только одно поле, представление все еще соединяет с тремя таблицами или только с двумя таблицами, что оно должно вычислить поле?
Обычно он должен попасть в три таблицы. Учтите
SELECT A.VAL, B.VAL, C.VAL FROM A JOIN B ON A.ID = B.ID JOIN C ON A.ID = C.ID
Возможно, что один идентификатор в "A" будет иметь ноль, 1 или несколько совпадений в B или C. Если таблица " C "были пустыми, представление никогда не вернет строку, поэтому даже просто запрашивая A.VAL или B.VAL, все равно нужно будет увидеть, есть ли соответствующая строка в" C ".
Исключение составляют случаи, когда из-за принудительного ограничения ссылочной целостности оптимизатор знает, что строка в 'B' всегда будет иметь родительскую строку в 'A'. В этом случае при выборе B.VAL не нужно будет фактически проверять наличие родительской строки в 'A'. Это продемонстрировано в этой статье
Как правило, ядро базы данных объединяет все три таблицы, чтобы гарантировать получение правильного ответа.
Oracle иногда удаляет одну из таблиц, если это не меняет результат.
Это может быть сделано, если: -
Существует ограничение внешнего ключа для таблицы, которую необходимо исключить (т. Е. Можно гарантировать, что строка в таблице будет найдена)
Таблица является в остальном не используется. т.е. не выбран из, в предложении where и т. д.
Это зависит от типа используемого объединения. Если все они являются внутренними соединениями, то определенно потребуется исследовать все три таблицы.