Как проверить, является ли отношение таблицы одним ко многим в SSMS

#sql #ssms

Вопрос:

Я пишу некоторый SQL-код на основе своих таблиц, но не хочу упускать ни одного крайнего случая. Мне интересно, как вы проверяете, существует ли связь «один ко многим» между двумя таблицами в SSMS

 SELECT *
FROM Houses
JOIN Addresses 
     on Houses.Id = Addresses.HouseId
 

К сожалению, данные, которые запрашиваются, не дают мне никакого представления.

Что я пытался сделать:

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

Могу я спросить, можно ли определить, один к одному через SSMS?

Комментарии:

1. Нет простого способа определить это — если, например, вы ожидаете, что, возможно, посмотрите на внешний ключ, и в нем есть галочка, указывающая, является ли он «один к одному» или «один ко многим». Теоретически вы могли бы просмотреть столбцы внешнего ключа и определить любые уникальные индексы, которые к ним применяются ……. но, честно говоря, способ установления отношений определяется бизнес-требованиями, лежащими в основе этих данных. Если вы работаете с базой данных (независимо от того, вводите ли вы данные или запрашиваете данные из нее), вы должны выводить информацию о взаимоотношениях из бизнес-потребностей. Каков ваш конкретный вариант использования?

2. Как вы думаете, почему вы пропустите данные с этим запросом? Существует связь между Домами и адресами, и вы выбираете ВСЕ Дома и ВСЕ связанные адреса. Если Дома. Значение идентификатора имело 2 совпадающих адреса. Значения HouseId в таблице адресов, то вы получите 2 строки обратно. В вашем запросе нет фильтра, чтобы сказать, что вы даете мне только первую связанную запись.

Ответ №1:

Вы можете запустить запрос, чтобы определить, сколько значений в каждой из двух таблиц. Ну, в этом случае мы будем считать, что это первичный ключ houses , а значения HouseId являются допустимыми идентификаторами:

 SELECT num_addresses, COUNT(*)
FROM (SELECT h.Id, COUNT(a.HouseId) as num_addresses
      FROM Houses h LEFT JOIN
           Addresses a
           ON h.Id = a.HouseId
      GROUP BY h.Id
     ) ha
GROUP BY num_addresses;
 

Затем интерпретируйте результаты:

  • Если единственная возвращенная строка имеет num_addresses значение 1 , то у вас есть отношение 1-1.
  • Если две строки возвращены со значениями 0 и 1 , то у вас есть соотношение 1/0-1.
  • Если возвращается несколько строк и минимальное 1 значение равно, то у вас есть 1-n. Если возвращается несколько строк и минимальное значение равно 0 , то у вас есть 0-n .

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

Ответ №2:

Взаимосвязь между таблицами показана с помощью так называемой «ДИАГРАММЫ БАЗЫ данных». Вот документ о том, как создать диаграмму базы данных в SSMS. Как создать SSMS схемы базы данных

Ответ №3:

Ответ Гордона Линоффа идеально подходит для обзора с вертолета —

Чтобы получить все записи рядом, просто выберите все столбцы из обеих таблиц рядом с левым соединением

 SELECT Houses.*, Address.*
FROM Houses 
left JOIN Addresses on Addresses.HouseId = Houses.Id
union all
SELECT Houses.*, Address.*
FROM Addresses 
left JOIN Houses  on  Houses.Id = Addresses.HouseId
 

Microsoft внедрила метод сокращенного кода, чтобы сделать то же самое, но я не изучал его, поэтому не смог прокомментировать

https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/outer-joins?view=sql-server-ver15

Что будет очевидно, так это то, что вы увидите Дома.Удостоверение личности и адреса.Идентификатор дома рядом — Пустое значение в любом из них означает, что в соответствующей таблице нет записи для соответствующего идентификатора или идентификатора дома

Затем вы можете выбрать эти записи о крайних случаях, как сочтете нужным