SQL Server: посмотреть, чтобы сохранить внешние ключи таблицы? - PullRequest
0 голосов
/ 09 февраля 2010

У меня есть таблица «Ученые», в которой есть много внешних ключей для справочных таблиц, таких как курсы и колледжи. Когда я создаю представление на этой таблице, чтобы вернуть подмножество ученых (например, тех, кто еще жив), у представления, кажется, нет тех же внешних ключей, что и у таблицы. Я новичок в SQL Server и не уверен, что делаю что-то не так или просто так.

Причина, по которой я спрашиваю, состоит в том, что наши клиенты используют построитель отчетов 2 для создания отчетов, и когда они создают свои запросы с помощью конструктора запросов, если они используют представление, конструктор запросов не подключает автоматически представление LivingScholars, скажем, к таблице колледжей.

Спасибо за любую помощь, Robin

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

То, что вы видите, нормально.

Представления не могут иметь внешние ключи. Полезно рассматривать представление как блок SQL, который SQL-сервер «вырезает и вставляет» в ваши запросы каждый раз, когда вы его используете.

Так что, если у вас есть поля, которые вам нужны из других таблиц, в этом сценарии часто лучше просто перенести их в само представление. Вы не будете испытывать никакого снижения скорости для этого. Просто сделайте очень широкий обзор, о котором ваши пользователи будут сообщать. Создателям отчетов будет легче, и, как я уже сказал, вы, скорее всего, не будете испытывать никакого снижения производительности, если будете присоединяться к таблицам, ссылки на внешние ключи которых находятся в таблицах, лежащих в основе представления.

Возможно, вы захотите создать пару представлений, по одному для каждого основного типа сценария запроса, с которым, как вы ожидаете, столкнутся ваши авторы отчетов.

0 голосов
/ 09 февраля 2010

Извините, если я не понимаю ... но что вы подразумеваете под "просмотреть внешние ключи"? Когда вы создаете свой вид, вы должны создать его как

SELECT     s.*
           , additional cols
FROM       Scholars s
JOIN       Courses c
ON         s.CourceID = c.ID
....
and so on
...