2010-04-06 24 views
10

Ho una domanda sull'utilizzo di subquery in un'istruzione Update. Il mio esempio:sottoquery in UPDATE SET (sql server 2005)

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

E 'possibile fare riferimento al valore di tabella principale (trips.guid) in sottoquery?

quando provo ad usare trips.guid ottengo l'errore:

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

La clausola di 'selezionare città Distinto da poi' tornare più di una città.

+0

È garantito che ci sia solo 1 città in poi per un trip_guid (o ti aspetti che lo gestisca in qualche modo per te)? –

+0

Ci sono almeno 2 cites. L'idea è di mettere tutte le citazioni in un campo. – itdebeloper

+0

Il tuo esempio funziona in Oracle. Per SQL Server sono applicabili le altre risposte. – Monstieur

risposta

28

Si può provare qualcosa di simile

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 anche se non sono d'accordo con la formattazione - inserirò 'INNER JOIN' nella riga successiva ;-) –

4

È possibile utilizzare le costanti e valori dal esterna selezionare nella sub-select:

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

Noi non sappiamo come le tabelle sembrano, quindi posso solo supporre che Distinct lavorerà per voi che modo (restituendo solo uno distinto city nella subquery).

+4

La sottoquery si interromperà se restituisce più di 1 record –

+0

@Jimmie R. Houts: corretto. Stavo aggiornando la mia risposta nel momento in cui hai postato il tuo commento, grazie! –

+0

Hai provato questo, dice ** Sintassi errata vicino a 't'.** –

8

Un'altra versione.

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

ho trovato la soluzione - basta spostare la subquery al FSU :)

UPDATE TRIPS 
    SET locations = getAllTripCity(guid); 

mio di UDF codice sorgente:

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 

Questo è tutto quello che devo fare - opere bene :)

0

Ho avuto lo stesso problema del poster iniziale. Il mio caso d'uso era il seguente: Una tabella conteneva la data e l'ora di un evento sportivo. Poiché ricevo informazioni da fonti diverse, ho modificato lo schema del database in modo da avere un valore int per il tempo e il datetime (o forse solo la data) per la data dell'evento sportivo.

Questa è la mia domanda:

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; 

Qualche spiegazione: Devi dare la sottoquery MatchStartTime un nome diverso altrimenti si ottiene un messaggio di avviso/errore da SQL Server. Ho anche dovuto aggiungere MatchId quindi sapevo che stavo aggiornando il Match corretto. Lo SportTypeId viene utilizzato per separare diversi sport nel database.

Grazie a @astander per avermi indicato nella giusta direzione. Senza il suo post avrei faticato un po 'di più per finire con questa soluzione.

Problemi correlati