Объединение нескольких таблиц на основе уникального идентификатора в одной таблице

#sql #sql-server #tsql #join

#sql #sql-сервер #tsql #Присоединиться

Вопрос:

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

Вот пример:

Расположение:

ID City_ID
1 92418

Профессиональные Спортивные команды:

City_ID Professional_Team_Count Количество участников
92418 3 75

Таблица непрофессиональных спортивных команд:

City_ID Non_Pro_Team_Count Количество участников
92418 25 750

Я пытаюсь вернуть таблицу, которая выглядит как эта таблица результатов

ID City_ID Professional_Team_Count Non_Pro_Team_Count Количество участников
1 92418 3 нулевой 75
1 92418 нулевой 25 750

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

1. Оба ваших «ответа» делают довольно важное предположение. Ты это видишь? Возможно, вы даже сделаете то же самое сами, потому что ваши примеры данных очень упрощены. Что происходит, когда обе таблицы содержат строку с одинаковыми значениями идентификатора местоположения и идентификатора продукта?

2. Этого не произойдет, потому что продукт с серийным номером уникален.

Ответ №1:

 select loc.Id, loc.locationId, s.ProductId, s.SerialNumber, null as Quantity  from Location loc inner join Serialized s on loc.LocationId = s.locationId where loc.Id = 1 union all select loc.Id, loc.locationId, ns.ProductId, null, ns.Quantity  from Location loc inner join nonSerialized ns on loc.LocationId = ns.locationId where loc.Id = 1  

сделал бы это. Вам нужно объединить данные из 2 наборов данных.

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

1. Использование union all позволит избежать дополнительной обработки для устранения повторяющихся строк. Я не совсем уверен, что дубликаты не могут возникать, но это зависит от того, знает ли ОП свои данные.

2. @HABO, может быть, но уже дубликаты не возникнут, если только это не очень плохо спроектированные данные. Я все равно отредактировал, чтобы добавить все.

Ответ №2:

Вам нужно выполнить объединение, чтобы получить строки из обеих таблиц:

 select loc.ID, loc.LocationID, s.ProductID, s.SerialNumber,   null as Quantity  from Location loc  join Serialized s on s.ID = loc.ID union all select loc.ID, loc.LocationID, ns.ProductID, null as SerialNumber,   ns.Quantity  from Location loc  join NonSerialized ns on ns.ID = loc.ID  

Ответ №3:

Чтобы избежать Location многократного объединения, вы можете поместить UNION ALL внутри производной таблицы

 select  loc.Id,  loc.locationId,  s.ProductId,  s.SerialNumber,  s.Quantity  from Location loc inner join (  select  s.locationId,  s.SerialNumber,  null as Quantity  from Serialized s  union all  select  ns.locationId,  null,  ns.Quantity  from nonSerialized ns ) s on loc.LocationId = s.locationId where loc.Id = 1;