#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
Что будет очевидно, так это то, что вы увидите Дома.Удостоверение личности и адреса.Идентификатор дома рядом — Пустое значение в любом из них означает, что в соответствующей таблице нет записи для соответствующего идентификатора или идентификатора дома
Затем вы можете выбрать эти записи о крайних случаях, как сочтете нужным