#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;