Подзапросы в UPDATE SET (sql server 2005)

У меня вопрос об использовании подзапросов в инструкции Update. Мой пример:

UPDATE TRIPS
   SET locations = city + ', ' FROM (select Distinct city 
                                       from poi 
                                      where poi.trip_guid = trips.guid) 

Можно ли ссылаться на значение главной таблицы (trip.guid) в подзапросах?

Когда я пытаюсь использовать trips.guid, я получаю ошибку:

"Идентификатор с несколькими частями" trip.guid "не может быть связан."

Пункт "выберите" Отличительный город от пои "возвращает больше одного города.

Ответ 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

Ответ 2

Другая версия.

UPDATE trips
SET locations = trips.city + ', ' + poi.city
FROM trips INNER JOIN poi
ON poi.trip_guid = trips.guid

Ответ 3

Вы можете использовать константы и значения из внешнего выбора в подвыборке:

Update trips
Set locations = ( Select Distinct trips.city + ', ' + poi.city
                  From poi
                  Where poi.trip_guid = trips.guid )

Мы не знаем, как выглядят ваши таблицы, поэтому я могу только предположить, что Distinct будет работать для вас таким образом (возвращая только один отдельный city в подзапросе).

Ответ 4

Я нашел решение - просто переместите подзапрос в 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

Что все, что мне нужно сделать - отлично работает:)

Ответ 5

У меня была та же проблема, что и исходный плакат. Моим вариантом использования было следующее: В одной таблице были дата и время спортивного события. Поскольку я получаю информацию из разных источников, я изменил схему базы данных, поэтому у меня было значение 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 за то, что указали мне в правильном направлении. Без его поста я бы боролся немного больше, чтобы закончить это решение.