2010-04-06 18 views
10

Tengo una pregunta sobre el uso de subconsultas en una instrucción de actualización. Mi ejemplo:subconsultas en UPDATE SET (sql server 2005)

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

¿Es posible hacer referencia al valor de la tabla principal (trips.guid) en las subconsultas?

cuando trato de usar trips.guid me sale el error:

"The multi-part identifier "trips.guid" could not be bound."

La cláusula 'seleccione la ciudad A diferencia de poi' volver más de una ciudad.

+0

¿Está garantizado que solo hay 1 ciudad en poi para un trip_guid (o espera que lo haga de alguna manera)? –

+0

Hay al menos 2 citas. La idea es poner todas las citas en un campo. – itdebeloper

+0

Su ejemplo funciona en Oracle. Para SQL Server, las otras respuestas son aplicables. – Monstieur

Respuesta

28

Puede intentar algo así como

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 
+5

+1 aunque no estoy de acuerdo con el formato - pondría el 'INNER JOIN' en la siguiente línea ;-) –

4

Puede utilizar las constantes y valores desde el exterior seleccione en la sub-select:

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

No sabemos cómo sus cuadros parecen, por lo que sólo podemos suponer que Distinct trabajará para usted que manera (devuelve solo un city distinto en la sub consulta).

+4

La subconsulta se romperá si devuelve más de 1 registro –

+0

@Jimmie R. Houts: Correcto. Estaba actualizando mi respuesta en el momento en que publicaste tu comentario, ¡gracias! –

+0

¿Realmente lo intentó? Dice ** Sintaxis incorrecta cerca de "t".** –

8

Otra versión.

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

he encontrado la solución - sólo mover la sub consulta a la UDF :)

UPDATE TRIPS 
    SET locations = getAllTripCity(guid); 

Mi código fuente de 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 

Eso es todo lo que tengo que hacer - las obras bien :)

0

Tuve el mismo problema que el cartel inicial. Mi caso de uso fue el siguiente: Una tabla contenía la Fecha y la Hora de un evento deportivo. Debido a que estoy obteniendo información de diferentes fuentes, cambié el esquema de la base de datos, así que tuve un valor int para la hora y la fecha (o tal vez la fecha) para la fecha del evento deportivo.

Esta es mi pregunta:

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; 

algunas explicaciones: Hay que darle la subconsulta MatchStartTime un nombre diferente de otro modo se obtiene una advertencia/error de SQL Server. También tuve que agregar MatchId, así que sabía que estaba actualizando la coincidencia correcta. El SportTypeId se usa para separar diferentes deportes en la base de datos.

Gracias a @astander por orientarme en la dirección correcta. Sin su publicación habría luchado un poco más para terminar con esta solución.