Создание связей по внешнему ключу
В этой статье описывается создание связей внешнего ключа в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Связь создается между двумя таблицами, чтобы связать строки одной таблицы со строками другой.
Разрешения
Создание новой таблицы с внешним ключом требует разрешения CREATE TABLE в базе данных и разрешения ALTER на схему, в которой создается таблица.
Создание внешнего ключа в существующей таблице требует разрешения ALTER на таблицу.
Ограничения и ограничения
- Ограничение внешнего ключа не обязательно должно быть связано только с ограничением первичного ключа в другой таблице. Внешние ключи также могут быть определены, чтобы ссылаться на столбцы ограничения UNIQUE в другой таблице.
- Если столбцу, имеющему ограничение внешнего ключа, задается значение, отличное от NULL, такое же значение должно существовать и в указываемом столбце. В противном случае будет возвращено сообщение о нарушении внешнего ключа. Для обеспечения проверки всех значений сложного ограничения внешнего ключа задайте параметр NOT NULL для всех столбцов, участвующих в индексе.
- Ограничения FOREIGN KEY могут ссылаться только на таблицы в пределах той же базы данных на том же сервере. Межбазовую ссылочную целостность необходимо реализовать посредством триггеров. Дополнительные сведения см. в статье об инструкции CREATE TRIGGER.
- Ограничения FOREIGN KEY могут ссылаться на другие столбцы той же таблицы и считаются ссылками на себя.
- Ограничение FOREIGN KEY, определенное на уровне столбцов, может содержать только один ссылочный столбец. Этот столбец должен принадлежать к тому же типу данных, что и столбец, для которого определяется ограничение.
- Ограничение FOREIGN KEY, определенное на уровне таблицы, должно содержать такое же число ссылочных столбцов, какое содержится в списке столбцов в ограничении. Тип данных каждого ссылочного столбца должен также совпадать с типом соответствующего столбца в списке столбцов.
- Ядро СУБД не имеет предопределенного ограничения на количество ограничений FOREIGN KEY, которые могут содержать ссылки на другие таблицы. Ядро СУБД также не ограничивает количество ограничений FOREIGN KEY, принадлежащих другим таблицам, ссылающимся на определенную таблицу. Но фактическое количество используемых ограничений FOREIGN KEY ограничивается конфигурацией оборудования, базы данных и приложения. Максимальное количество таблиц и столбцов, на которые может ссылаться таблица в качестве внешних ключей (исходящих ссылок), равно 253. SQL Server 2016 (13.x) и более поздних версий увеличивает ограничение числа других таблиц и столбцов, которые могут ссылаться на столбцы в одной таблице (входящей ссылки) с 253 до 10 000. (Требуется уровень совместимости не менее 130.) Увеличение имеет следующие ограничения:
- Превышение 253 ссылок на внешние ключи поддерживается только для операций DELETE и UPDATE DML. Операции MERGE не поддерживаются.
- Таблица со ссылкой внешнего ключа на саму себя по-прежнему ограничена 253 ссылками на внешние ключи.
- Превышение числа в 253 ссылки на внешние ключи в настоящее время недоступно для индексов columnstore, оптимизированных для памяти таблиц или Stretch Database.
Stretch Database устарел в SQL Server 2022 (16.x) и База данных SQL Azure. Эта функция будет удалена в будущей версии ядро СУБД. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
Создание связи по внешнему ключу в конструкторе таблиц
Использование SQL Server Management Studio
- В обозревателе объектов щелкните правой кнопкой мыши таблицу, которая будет содержать внешний ключ для связи, и выберите пункт Конструктор. Таблица откроется в окне Конструктор таблиц.
- В меню конструктора таблиц выберите Связи. (См. меню Конструктор таблиц в заголовке или щелкните правой кнопкой мыши пустое место определения таблицы и выберите Связи.)
- В диалоговом окне Связи внешнего ключа нажмите кнопку Добавить. Связь отображается в списке выбранных связей с именем, предоставленным системой, в формате FK_tablename_ >, где имя первой таблицы — имя внешней таблицы ключей, а второе имя таблицы — имя таблицы первичного ключа. Это просто принятое по умолчанию и распространенное соглашение об именах для поля (Name) объекта внешнего ключа.
- Выберите нужную связь в списке Выбранные связи.
- Выберите Спецификация таблиц и столбцов в сетке справа и нажмите кнопку с многоточием (…) справа от свойства.
- В диалоговом окне Таблицы и столбы в раскрывающемся списке Первичный ключ выберите таблицу, которая будет находиться на стороне первичного ключа связи.
- В сетке внизу выберите столбцы, составляющие первичный ключ таблицы. В соседней ячейке сетки справа от каждого столбца выберите соответствующий столбец внешнего ключа таблицы внешнего ключа. Конструктор таблиц автоматически предлагает имя для связи. Чтобы его изменить, отредактируйте содержимое текстового поля Имя связи .
- Нажмите кнопку OК , чтобы создать связь.
- Закройте окно конструктора таблиц и сохраните внесенные изменения, чтобы изменения связи внешнего ключа вступили в силу.
Создание внешнего ключа в новой таблице
Использование Transact-SQL
В следующем примере создается таблица и определяется ограничение внешнего ключа для столбца TempID , ссылающегося на столбец SalesReasonID в таблице Sales.SalesReason базы данных AdventureWorks . Предложения ON DELETE CASCADE и ON UPDATE CASCADE используются для обеспечения распространения изменений, вносимых в таблицу Sales.SalesReason на таблицу Sales.TempSalesReason .
CREATE TABLE Sales.TempSalesReason ( TempID int NOT NULL, Name nvarchar(50) , CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID) , CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE ) ;Создание внешнего ключа в существующей таблице
Использование Transact-SQL
В следующем примере создается внешний ключ для столбца TempID , ссылающегося на столбец SalesReasonID в таблице Sales.SalesReason базы данных AdventureWorks .
ALTER TABLE Sales.TempSalesReason ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE ;Следующие шаги
- Ограничения первичных и внешних ключей
- GRANT (разрешения на базу данных)
- ALTER TABLE
- CREATE TABLE
- ALTER TABLE table_constraint.
Как посмотреть связи таблиц sql
Для просмотра связей между таблицами в SQL можно использовать системную таблицу INFORMATION_SCHEMA . INFORMATION_SCHEMA содержит метаданные о базе данных, включая информацию о таблицах, столбцах и связях.
Чтобы просмотреть связи между таблицами, можно использовать запрос следующего вида:
SELECT tc.constraint_name, tc.table_name, kcu.column_name, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='имя_таблицы';Здесь имя_таблицы — это имя таблицы, связи которой вы хотите просмотреть.
Этот запрос вернет список всех внешних ключей в таблице, включая имя ключа, имя таблицы, столбец таблицы, связанный с внешним ключом, имя таблицы, связанной с внешним ключом, и соответствующий столбец в этой таблице. Эти данные могут помочь вам понять, как связаны различные таблицы в вашей базе данных.
Настройка связи с MS SQL
r_keeper_7 можно связать только с MS SQL версии 2012 и выше. В статье рассмотрена настройка связи с MS SQL 2012.
Установка SQL сервера
Для установки SQL сервера:
-
Установите MS SQL Server 2012 или выше. Можно использовать выпуск Express.
Во время установки сервера используйте смешанный режим аутентификации и задайте пароль для пользователя — sa
- MS SQL состоит из двух компонентов. Установите второй компонент — SQL Management Studio, запустите его и создайте новую базу, например с именем RK7.
- В Диспетчере конфигурации SQL Server включите протокол TCP/IP. Для этого:
- Раскройте ветку Сетевая конфигурация SQL Server.
- Выберите Протоколы MSSQLSERVER.
- Дважды нажмите по строке TCP/IP.

- В открывшемся окне на вкладке Протокол включите поле Включено.

- Убедитесь, что во вкладке IP-адреса в блоке IPAll указан порт. По умолчанию порт 1433, но вы можете указать любой свободный порт.

- Перезапустите SQL Server.
Режим версионности строк
Вы можете перевести базу в режим версионности строк — Row Versioning. Это необязательный режим, поэтому эту настройку можно пропустить.
По умолчанию SQL Server работает в режиме Read Commited, который подразумевает блокирование данных во время запроса. Это может сильно помешать в случае многопользовательской работы. Начиная с версии 2005, поддерживается режим READ COMMITTED using row versioning. В этом режиме блокировки могут помешать только в том случае, когда разные пользователи пишут в одно и то же место,. Чтение данных никогда не блокируется и никого не блокирует.
Для включения режима версионности строк выполните скрипт:
ALTER DATABASE RK7 SET READ_COMMITTED_SNAPSHOT ON;
Восстановление базы данных из резервной копии
Вы можете восстановить базу данных из резервной копии:
- Запустите MS SQL Server Management Studio и пройдите авторизацию
- Слева в окне Обозреватель объектов выделите группу Базы данных
- Вызовите контекстное меню правой кнопкой мыши и выберите пункт Восстановить базу данных
- В открывшемся окне в разделе Общие укажите источник Устройство, а затем нажмите кнопку с тремя точками.

- Выберите тип носителя Файл и нажмите кнопку Добавить.

- Укажите путь к файлу и нажмите ОК.
- Проверьте базу на ошибки, нажав кнопку Проверка носителя резервной копии, и затем нажмите ОК.
- Дождитесь восстановления базы. После успешного восстановления система сообщит о завершении процесса:


Готово. База появится в списке баз данных.
Настройки в менед жерской станции
Чтобы настроить станцию, выполните следующие действия:
- Зайдите в справочник Сервис > Экспорт данных > Настройки Внешних БД и сделайте копию предустановленной настройки «Microsoft SQL Server». Присвойте ей уникальное имя и смените статус настройки на Активный.
- В по ле Осн овное > Строка соединения нажмите на кнопку в конце строки или дважды нажмите на по ле ввода.

- Откроется окно ConnectionString. Нажмите кнопку Build.
- Откроется окно Свойства канала передачи данных. Н астройте связь с базой данных, созданной ранее:
- Перейдите во вкладку Поставщик данных и убедитесь, что выбран Microsoft OLE DB Provider for SQL Server.

- Во вкладке Соединение выберите сервер из списка, введите имя пользователя и пароль. Если нужного сервера нет в списке, то необходимо вручную ввести его имя.
Если SQL-север установлен на том же компьютере, что и сервер справочников или отчетов, укажите адрес 127.0.0.1. Если на другом — укажите его IP-адрес и убедитесь, что сервер доступен по сети.
Имя сервера также можно посмотреть при запуске SQL Server Management Studio.
Введите имя пользователя и пароль. Выберите базу данных на сервере и нажмите Проверить подключение. - Если проверка соединения прошла успешно, то нажмите ОК.
- В окне Свойства канала передачи данных нажмите ОК. Поле Строка соединения примет вид:
Provider=SQLOLEDB.1;Password=[пароль];Persist Security Info=True;User Catalog=[имя базы];Data Source=[имя сервера или IP-адрес].Выполните выгрузку в БД SQL, используя созданную настройку:
- Перейдите в меню Сервис > Экспорт данных > Экспорт в другую БД.
- В поле Параметры соединения выберите созданную настройку.
- Укажите Имя пользователя и Пароль.
- В блоке Параметры экспорта оставьте флаги по умолчанию, если выгрузка происходит в чистую БД SQL.
- Нажмите Проверить.
- При удачном соединении кнопка ОК станет активной, нажмите ее. Запустится экспорт данных в БД SQL. В этот момент в SQL создаются таблицы.
При успешной выгрузке окно с настройками экспорта данных закроется. Появится сообщение Экспорт завершен успешно.
Далее необходимо настроить сервер справочников, пролицензировав его и выбрав созданную настройку. Для этого:

- Перейдите в меню Настройки > OLAP Отчеты > Серверы Отчетов , выберите нужный сервер и настройте его:
- Пролицензируйте сервер справочников/отчетов согласно описанию в статье настройка сервера справочников.
- В группе Связь с внешней БД :
- В поле Настройки связи с внешней БД выберите созданную настройку.
- В поле Имя пользователя внешней БД пропишите имя пользователя БД SQL.
- В поле Пароль пользователя внешней БД прописать пароль пользователя БД SQL.
- Укажите такие же настройке в группе Логи справочников :
- В поле Настройки связи с внешней БД выберите созданную настройку.
- В поле Имя пользователя внешней БД пропишите имя пользователя БД SQL.
- В поле Пароль пользователя внешней БД пропишите пароль пользователя БД SQL.
- В группе Основное сделать следующее:
- В поле Источник данных кубов выберите параметр БД SQL.
- В поле Протоколирование запросов выберите подходящий параметр:
- llAll протоколировать все запросы
- llErroneous протоколировать запросы с ошибками
- llNone — не протоколировать
- В поле Режим базы данных UDB выберите один из режимов: большой, средний, маленький, ультра легкий. Данный режим относиться к накопительной базе Check.udb.
- Большой — полная копия. Это режим по умолчанию. Используется для простых ресторанов, не сетевых. Не меняйте параметр Полная копия на другое, пока не настроите соединение с внешней базой данных.
- Средний — частичная копия. Режим означает, что кроме данных заказов, все суммы будут сохраняется в check.udb.
- Маленький — только чеки. Режим используется, если вы уверены, что будет иметься достаточно много накопительных данных — несколько ресторанов. В большинстве случаев рекомендуется использовать этот режим, чтобы база не становилась слишком большой.
- Ультралегкий — только общие смены. В check.udb будет содержаться только информация об общих сменах и ссылки на них в базе SQL.
Если вы решили изменить Режим базы данных UDB с большого на маленький при настроенной связи с SQL, то есть ресторан проработал в таком режиме уже продолжительное время, и выполнить ручной экспорт накопительных данных повторно, то размер файла Check.udb автоматически уменьшится. В результате большая часть информации из этой базы будет удалена, и в базу SQL экспортируются не все данные. Поэтому никогда не делайте экспорт накопительных данных, если вы используете режим базы данных UDB Маленький или Средний.
Выбранный режим базы данных UDB никак не влияет на справочную информацию. Справочная информация всегда сохраняется на каждом сервере отчетов в полном объеме и может быть экспортирована повторно при необходимости.
- В секции Обработка данных выберите ресторан, данные с которых нужно собирать и видеть в отчетах.
- В конфиг урационном файле сервера справочников rk7srv.INI и в файле сервера отчетов repsserv.ini пропишите параметр UseSQL=1 .
- Д ля сервера справочников параметр необходимо прописать в секции [RefServer]
- Для сервера отчетов — в секции [Config].
- Д ля сервера справочников параметр необходимо прописать в секции [RefServer]
- Перезагрузите сервер справочников и сервер отчетов.
Все изменения в настройках внешней БД происходят во время работы сервера при параметре UseSQL=0.
Если необходимо поменять настройки внешней БД:
- Остановите все серверы отчетов и сервер справочников, которые используют эту настройку.
- В конфигурационном файле сервера справочников rk7srv.INI или сервера отчетов repsserv.ini пропишите параметр UseSQL=0.
- Запустите нужный сервер.
- Поменяйте настройки.
- Вновь остановите сервер.
- В конфигурационном файле верните параметру UseSQL значение 1 — UseSQL=1.
Готово, мож но продолжать р аботу.
Одновременно для нескольких ролей в r_keeper нельзя сделать связь с БД в SQL Server используя одного и того же пользователя в БД SQL. В r_keeper не сохранится информация о пользователе в настройках связи с внешней БД.
Оптимизация производительности

В целях экономии дискового пространства и некоторого увеличения производительности рекомендуется использовать Простую — Simple модель восстановления.
Ознакомиться с различными моделями восстановления SQL, их различиями и особенностями вы можете в официальной документации Microsoft.После изменения модели восстановления необходимо выполнить сжатие файла лога. Для этого:
- Нажмите правой кнопкой мыши на используемую базу данных
- Выберите Задачи >Сжать >Файлы
- В открывшемся окне выберите тип файла Журнал
- Нажмите на кнопку ОК.
Возможные проблемы
Проблема: Иногда может не идти экспорт в только что созданную БД сервера SQL Server 2008 при выбранном провайдере Native Client.
Решение: Выберите другой провайдер Microsoft OLE DB Provider for SQL Server, создайте заново чистую БД и повторите экспорт.Проблема: Не строятся прямые отчеты
Решение: Если у роли отличаются права доступа на просмотр отчетов на разные объекты, то для построения прямых отчетов необходимо завести разных пользователей на SQL сервере. Затем настройте роли с такими пользователями в SQL. Для этого:- В менеджерской станции r_keeper перейдите в меню Персонал > Работники
- Выберите роль, которой хотите предоставить доступ, и перейдите в ее Свойства
- Раскройте раздел Связь с внешней БД и дважды нажмите на поле SQL конфигурация
- Укажите Имя пользователя и Пароль для создания нового пользователя в SQL

- Войдите в MS SQL, используя созданные данные. В базе данных появится пользователь.

Связи между таблицами MS SQL: обзор основных отношений и типов соединения

Связи между таблицами в базе данных — основа хранения данных в СУБД.
Связи в базе данных MS SQL позволяют нормализировать БД, настроить отношение между данными таблиц и сделать эффективные выборки данных. Главное — понять, как настраивать и использовать связи между таблицами MS SQL. Это необходимое условие для работы с любой БД.
Ниже рассмотрим основные концепции связей: Foreign Key и JOINs.
Foreign Key
Создание связей MS SQL между таблицами происходит через внешний ключ (foreign key). Данный ключ связывает поле (значение) исходной таблицы с Primary Key внешней таблицы. Через внешний ключ можно не только производить выборку данных, но и контролировать удаление данных в главной таблице:
- NO ACTION — не производит никаких действий;
- SET NULL — зависимые данные установятся в NULL при удалении записи из главной таблицы (primary table);
- CASCADE — удаляются зависимые данные. Опасная операция. В реальной жизни используется редко.
Подробнее об этом — на курсе «Аналитик данных». За 12 месяцев разберетесь в основных данных, научитесь делать таблицы, соединять и обрабатывать несколько сразу, использовать оконные функции. Станете настоящим экспертом в аналитике!
ALTER TABLE ADD CONSTRAINT FK__ FOREIGN KEY () REFERENCES () ON UPDATE ON UPDATE
Типы соединения JOINs
Когда отношения между таблицами установлены, можно делать выборки данных из этих связанных таблиц.
Существует несколько механизмов соединения двух таблиц в запросе: это основные типы JOINs для MS SQL SERVER. И они практически всегда совпадают для всех реляционных СУБД.
Рассмотрим основные типы JOINs. Будем считать, что у нас есть левая и правая таблицы, которые соединяем через JOIN. *Левая и правая относительно слова JOIN.
Есть несколько механизмов соединения двух таблиц в запросе. Например, Oracle содержит Natural Join, который соединяет колонки с одинаковыми именами в таблицах. Используется крайне редко.
Обо всех способах соединения — на курсе «Аналитик данных». Уделяйте учебе всего два часа в день — и научитесь обновлять, удалять и добавлять записи, использовать разные соединения, чтобы решать реальные задачи.
LEFT (OUTER) JOIN

Всегда выводите данные по левой таблице. Если правая таблица не содержит связанных данных, то выводите NULL для этих значений.
select * from A left join B on A.ID = B.A_ID
A1 B1 A2 B2 A3 NULL RIGHT (OUTER) JOIN

Обратное от Left Join. Используют редко. Всегда можно переписать на Left Join — тогда запрос легче читать. В частных случаях бывает, что Right Join дает лучшую статистику выполнения и оптимизирует запрос.
A left join B = B right join A:select * from B right join A on A.ID = B.A_ID
A1 B1 A2 B2 A3 NULL Аналитик данных: новая работа через 5 месяцев
Получится, даже если у вас нет опыта в IT
INNER JOIN

Выводите значения для строки из левой таблицы, только если есть связанные данные в правой таблице. Часто используют, чтобы отфильтровать данные левой таблицы и выводить только те записи, по которым есть значения в правой.
На курсе «Аналитик данных» вы не только изучите теорию, но и выполните практические задания. Если возникнут сложности — помогут кураторы с реальным опытом в аналитике. Благодаря их помощи подготовите интересные проекты для портфолио.
select * from A inner join B on A.ID = B.A_ID -- аналог запроса на left join select * from A left join B on A.ID = B.A_ID where B.ID is not null
A1 B1 A2 B2 CROSS JOIN
Это пересечение всех строк из левой таблицы со всеми строками правой таблицы.
select * from A cross join B
A1 B1 A1 B2 A2 B1 A2 B2 FULL JOIN

Представьте, что это смешанное сочетание Left Join и Right Join. Вначале выводятся значения левой таблицы, а правой заполняются NULL, затем — наоборот.
Запрос выводит пересечение значений. Если нет пересечений, то выводит значения по A и B c NULL:
select * from A full join B on A.ID = B.A_ID
A1 B1 A2 B2 A3 NULL NULL B4 Типы отношений между таблицами
Используем Foreign Key и JOINs и создадим реальный пример бизнес-задачи. А еще рассмотрим настройку связей между таблицами.
Введем сущности Clinics, Doctors, Patients и Appointments.
- Доктор работает или не работает только в одной клинике.
- У доктора может быть вышестоящий менеджер.
- Пациент может обращаться в разные клиники к разным докторам.
Создадим таблицы БД, пока без связей с сурогатными Primary Keys:
CREATE TABLE dbo.Clinics ( ID int, Name varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, CONSTRAINT Clinics_PK PRIMARY KEY (ID) ); CREATE TABLE dbo.Patients ( ID int, Name varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, CONSTRAINT Patients_PK PRIMARY KEY (ID) ); CREATE TABLE dbo.Doctors ( ID int, Name varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, Clinic_ID int NULL, Manager_ID int NULL, CONSTRAINT Doctors_PK PRIMARY KEY (ID) ); CREATE TABLE dbo.Appointments ( ID int, [Date] datetime2(0) NOT NULL, Patient_ID int NOT NULL, Doctor_ID int NOT NULL, CONSTRAINT Appointments_PK PRIMARY KEY (ID) );
insert into dbo.Clinics values (1, 'First Clinic'), (2, 'Second Clinic') insert into dbo.Doctors values (10, 'Doctor', 1, NULL), (11, 'Assistent Doctor', 1, 10), (12, 'Another Doctor', 2, NULL), (13, 'Retired Doctor', NULL, NULL), (15, 'Assist 2 Doctor', 1, 11) insert into dbo.Patients values (100, 'First Patient'), (101, 'Second Patient') insert into dbo.Appointments values (1000, GETDATE(), 100, 10), (1001, GETDATE(), 101, 10), (1002, GETDATE(), 100, 12)
Отношения «один к одному»
Используйте данную связь, когда значению из таблицы соответствует только одна запись из внешней таблицы. «Доктор может работать только в одной клинике». Можем предположить, что связь между Clinics и Doctors будет «один к одному»:
ALTER TABLE dbo.Doctors ADD CONSTRAINT FK_Doctors_ClinicID FOREIGN KEY (Clinic_ID) REFERENCES dbo.Clinics(ID);
select d.Name, c.Name from dbo.Doctors d left join dbo.Clinics c on c.ID = d.Clinic_ID;
Отношение «один ко многим»
Одной записи из таблицы соответствуют несколько записей из внешней. Данный тип связи очень распространен при построении схемы БД.
«Хотя доктор может принадлежать только одной клинике, клиники, в свою очередь, содержат штат докторов». Это отношение «один ко многим»:
select c.Name, d.Name from dbo.Clinics c inner join dbo.Doctors d on d.Clinic_ID = c.ID;
CLINIC DOCTOR First Clinic Doctor First Clinic Assistent Doctor First Clinic Assist 2 Doctor Second Clinic Another Doctor Отношение «многие ко многим»
Организуется через промежуточную таблицу, в которой есть внешние ключи на разные таблицы.
О временных таблицах вы подробнее узнаете на курсе «Аналитик данных». Научитесь работать с временными таблицами, использовать оконные функции и соединять таблицы в SQL, применять их для сложных запросов.
В таблице Appointments есть связь на таблицы Doctors и Patients. Таким образом, организована связь между пациентами и докторами: пациент может посещать нескольких докторов, а доктора — принимать нескольких пациентов.
ALTER TABLE dbo.Appointments ADD CONSTRAINT FK_Appointments_DoctorID FOREIGN KEY (Doctor_ID) REFERENCES dbo.Doctors(ID); ALTER TABLE dbo.Appointments ADD CONSTRAINT FK_Appointments_PatientID FOREIGN KEY (Patient_ID) REFERENCES dbo.Patients(ID);
Это довольно распространенный вопрос на собеседовании для SQL-разработчика. Если программист может на примере объяснить, как строится связь «многие ко многим», — это уже хороший показатель для интервьюера.
Как получить список посещений пользователя с указанием клиники и докторов:
select p.Name, a.[Date], d.Name, c.Name from dbo.Patients p inner join dbo.Appointments a on a.Patient_ID = p.ID inner join dbo.Doctors d on d.ID = a.Doctor_ID inner join dbo.Clinics c on c.ID = d.Clinic_ID where p.ID = 100;
PATIENT DATE DOCTOR CLINIC First Patient 2022-08-06 07:41:45.000 Doctor First Clinic First Patient 2022-08-06 07:41:45.000 Another Doctor Second Clinic Связь с самим собой
Такой тип связи называется рекурсивным, или иерархическим: связывание строки со строкой из той же таблицы. Полезно при отображении древовидной структуры.
Таблица Doctors содержит колонку Manager, в которой указано, кто из докторов является менеджером текущего доктора. Здесь связь на строку из той же таблицы докторов.
Как рекурсивно получить список докторов, у которых определенный доктор является вышестоящим менеджером:
with cte as ( select d.ID, d.Name from dbo.Doctors d where d.ID = 10 union all select d2.ID, d2.Name from dbo.Doctors d2 inner join cte on cte.ID = d2.Manager_ID ) select * from cte
- Перейдите во вкладку Поставщик данных и убедитесь, что выбран Microsoft OLE DB Provider for SQL Server.