Member 11856456 Ответов: 2

Как мне показать отношения один ко многим


У меня есть datagridview, где у меня есть шесть столбцов. Я использую оператор left join для объединения 4 таблиц, чтобы просеять данные с помощью файлера. Я использую Individual_ID для объединения таблиц.

Если все объединенные таблицы имеют только одну ссылку на индивидуальный идентификатор, то это приводит к получению этих результатов. Однако, если я добавляю более одной ссылки на индивидуальный идентификатор, он не выводит никаких табличных данных, почему бы и нет.

Пример данных:

Профильный стол
Individual_ID
Имя
Второе имя
Фамилия
Month_of_birth
Day_of_birth
Год рождения
АБОНЕНТСКИЙ ЯЩИК

Таблица смерти
Death_ID
ДОД
СТРУЧОК
Причина смерти
Individual_ID

Кладбищенский стол
Cem_ID
Cem_name
Место захоронения
Individual_ID

мой datagridview настроен следующим образом:

Individual_ID имя дата рождения ПОБ
1 Джонсон, Джон 10/18/1900 Чикаго, Иллинойс
2 Мэтьюз, Майк 28.11.1910 Балтимор, Мэриленд



Запрос, который я использую, таков:

"Select profile.Individual_ID, First_name, Middle_name, Last_name, Sex, Race, Place_of_birth, County_of_birth, State_of_birth, Place_of_death, State_of_death, County_of_death, Month_of_death, day_of_death, Year_of_death, Cause_of_death, Cemetery_name, Cemetery_state, Cemetery_county, Cemetery_address, Section, Row, Lot, Grave, Burial_date From profile left join death On Profile.Individual_ID = death.Individual_ID left join cemeteries On death.cemetery_ID = cemeteries.cemetery_ID left join cemetery_reference On Cemetery_reference.cemetery_ID = cemeteries.cemetery_ID "


допустим, человека хоронили 2 раза, тогда вышеприведенный запрос не работает. Однако, если человек похоронен один раз, то все появляется в gridview. Это только тогда, когда Individual_ID ссылается на другие таблицы более одного раза, что дает мне проблему.

Что я уже пробовал:

Попытался повернуть все операторы join, но все равно не смог получить никаких данных, чтобы появиться, если у меня есть более одной ссылки на Individual_ID.

Santosh kumar Pithani

Как вы заметили, "если я добавляю более одной ссылки на индивидуальный идентификатор, он не выводит никаких табличных данных"..Я думаю, что вы использовали оператор "и", чтобы добавить еще одно условие, так что используйте "или" вместо этого вы можете найти лучше.

Maciej Los

Можете ли вы поделиться образцами данных и своим запросом? Воспользуйся "Улучшить вопрос" виджет.
Вы видели мой ответ на этот вопрос: Как мне получить внутреннее соединение с 4 таблицами для работы (VB.NET)[^]?

Member 11856456

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

phil.o

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

Member 11856456

Я пересмотрел свой вопрос и включил больше, плюс я добавил свой запрос.

2 Ответов

Рейтинг:
2

Maciej Los

Ваша структура базы данных такова неправильный. Я делаю не рекомендовать отделить детали смерти от личности. Это строго связано с человеком (другими словами: человек не может умереть дважды /или больше/)
Я бы настоятельно рекомендовал чтобы прочитать о нем Нормализация базы данных[^].

Взгляните на пример структуры базы данных:

DECLARE @Person TABLE(PersonID INT IDENTITY(1,1), FName NVARCHAR(30), LName NVARCHAR(50), DOB DATETIME, POB NVARCHAR(150), DOD DATETIME, COD NVARCHAR(255))
--DOB -> Date Of Born
--DOD -> Date Of Death
--COD -> Cause Of Death

DECLARE @Cementary TABLE(CementaryID INT IDENTITY(1,1), CName NVARCHAR(30), City NVARCHAR(150))

DECLARE @PlaceOfBuried TABLE(PobID INT IDENTITY(1,1), PersonID INT, CementaryID INT, AlleyNo INT, PlaceNo INT, DOA DATETIME)
--DOA -> Date Of Burial


INSERT INTO @Person (FName, LName, DOB, POB, DOD, COD)
VALUES ('John', 'Doe', '1932-05-25', 'Alabama', '2002-06-01', 'Cancer'),
('Joe', 'Doe', '1940-01-15', 'Paris', '2001-12-21', 'Natural (age)'),
('Jimmy', 'Doe', '1938-02-12', 'Paris', '1997-11-11', 'Car accident')

INSERT INTO @Cementary (CName, City)
VALUES('PSG', 'Paris'), ('AHC', 'Alabama')

INSERT INTO @PlaceOfBuried (PersonID, CementaryID, AlleyNo, PlaceNo, DOA)
VALUES(1, 1, 1, 1, '2002-06-06'),
(2, 2, 1, 1, '2001-12-27'),
(1, 2, 2, 2, '2018-06-30'),
(2, 1, 3, 3, '2018-07-01')

SELECT P.*, C.CName, C.City, PB.AlleyNo, PB.PlaceNo, PB.DOA 
FROM @PlaceOfBuried AS PB 
	INNER JOIN @Person AS P ON P.PersonID = PB.PersonID 
	INNER JOIN @Cementary AS C ON C.CementaryID  = PB.CementaryID 
ORDER BY P.PersonID, PB.DOA 


Результат выше SELECT заявление:
PersonID	FName	LName	DOB	POB	DOD	COD	CName	City	AlleyNo	PlaceNo	DOA
1	John	Doe	1932-05-25 00:00:00.000	Alabama	2002-06-01 00:00:00.000	Cancer	PSG	Paris	1	1	2002-06-06 00:00:00.000
1	John	Doe	1932-05-25 00:00:00.000	Alabama	2002-06-01 00:00:00.000	Cancer	AHC	Alabama	2	2	2018-06-30 00:00:00.000
2	Joe	Doe	1940-01-15 00:00:00.000	Paris	2001-12-21 00:00:00.000	Natural (age)	AHC	Alabama	1	1	2001-12-27 00:00:00.000
2	Joe	Doe	1940-01-15 00:00:00.000	Paris	2001-12-21 00:00:00.000	Natural (age)	PSG	Paris	3	3	2018-07-01 00:00:00.000


Как вы видите, я использовал INNER JOIN, потому что я хотел показать всех людей, которые были похоронены. В случае, если вы хотите удалить всех людей (похороненных/не похороненных), вы должны изменить тип соединения на LEFT|RIGHT JOIN.

Удачи вам!


Member 11856456

Извините за путаницу. Я разделил смерти, потому что все в моей базе данных не только люди, которые умерли, но и живые родственники. Если бы информация включала только мертвых людей, я бы разработал одну таблицу, чтобы включить и эти данные. Первоначально я использовал внутреннее соединение. Однако, если в информации есть только дата смерти, я получаю 0 результатов, и это оставляет меня с пустой сеткой данных. Там, где у вас есть personID, я хочу, чтобы это имя появилось только 1 раз, а остальное будет обработано в другой форме.

Рейтинг:
0

yanda22

Используйте идентификатор в качестве вторичного, составного или внешнего ключа при ссылке на него в других таблицах, в зависимости от того, как они взаимодействуют