Ответ 1
Вы можете попробовать что-то вроде
UPDATE trips
SET locations = t.city + ', ' + poi.city
FROM trips t INNER JOIN
(
select Distinct city, trip_guid from poi
) poi ON t.trip_guid = poi.trip_guid
У меня вопрос об использовании подзапросов в инструкции Update. Мой пример:
UPDATE TRIPS
SET locations = city + ', ' FROM (select Distinct city
from poi
where poi.trip_guid = trips.guid)
Можно ли ссылаться на значение главной таблицы (trip.guid) в подзапросах?
Когда я пытаюсь использовать trips.guid
, я получаю ошибку:
"Идентификатор с несколькими частями" trip.guid "не может быть связан."
Пункт "выберите" Отличительный город от пои "возвращает больше одного города.
Вы можете попробовать что-то вроде
UPDATE trips
SET locations = t.city + ', ' + poi.city
FROM trips t INNER JOIN
(
select Distinct city, trip_guid from poi
) poi ON t.trip_guid = poi.trip_guid
Другая версия.
UPDATE trips
SET locations = trips.city + ', ' + poi.city
FROM trips INNER JOIN poi
ON poi.trip_guid = trips.guid
Вы можете использовать константы и значения из внешнего выбора в подвыборке:
Update trips
Set locations = ( Select Distinct trips.city + ', ' + poi.city
From poi
Where poi.trip_guid = trips.guid )
Мы не знаем, как выглядят ваши таблицы, поэтому я могу только предположить, что Distinct
будет работать для вас таким образом (возвращая только один отдельный city
в подзапросе).
Я нашел решение - просто переместите подзапрос в UDF:)
UPDATE TRIPS
SET locations = getAllTripCity(guid);
Мой исходный код UDF:
CREATE FUNCTION dbo.getAllTripCity(
@tripGuid uniqueidentifier
)
RETURNS nvarchar(200)
AS
BEGIN
DECLARE @cities nvarchar(200);
set @cities = ''
select @cities = @cities + city + ' ' from (select DISTINCT city poi where poi.trip_guid = @tripGuid)
return @ @cities;
END
Что все, что мне нужно сделать - отлично работает:)
У меня была та же проблема, что и исходный плакат. Моим вариантом использования было следующее: В одной таблице были дата и время спортивного события. Поскольку я получаю информацию из разных источников, я изменил схему базы данных, поэтому у меня было значение int для времени и времени (или, возможно, только даты) для даты спортивного события.
Это мой запрос:
UPDATE Matches
SET StartTime= MatchTime.ThisMatchStartTime
FROM Matches AS M
INNER JOIN (SELECT CONVERT(int, CONVERT(varchar, DATEPART(Hour, MatchDate)) + RIGHT('00' + CONVERT(varchar, DATEPART(Minute, MatchDate)),2)) AS ThisMatchStartTime, MatchId
FROM [Matches]
WHERE SportTypeId=16) AS MatchTime ON M.MatchId=MatchTime.MatchId
WHERE StartTime > 2400
AND SportTypeId = 16;
Некоторые объяснения: Вы должны дать подзапросу MatchStartTime другое имя, иначе вы получите предупреждение/ошибку от SQL Server. Мне также пришлось добавить MatchId, поэтому я знал, что обновляю правильный Матч. SportTypeId используется для разделения различных видов спорта в базе данных.
Спасибо @astander за то, что указали мне в правильном направлении. Без его поста я бы боролся немного больше, чтобы закончить это решение.