подзапросы в UPDATE SET (sql server 2005) - PullRequest
10 голосов
/ 06 апреля 2010

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

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

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

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

"Не удалось связать идентификатор из нескольких частей" trips.guid ".

Пункт «выберите отдельный город из точки» возвращает более одного города.

Ответы [ 5 ]

28 голосов
/ 06 апреля 2010

Вы можете попробовать что-то вроде

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
8 голосов
/ 06 апреля 2010

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

UPDATE trips
SET locations = trips.city + ', ' + poi.city
FROM trips INNER JOIN poi
ON poi.trip_guid = trips.guid
4 голосов
/ 06 апреля 2010

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

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

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

1 голос
/ 22 мая 2010

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

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

0 голосов
/ 04 декабря 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...