2010-04-06 11 views
10

Mam pytanie dotyczące korzystania z podzapytań w instrukcja aktualizacji. Mój przykład:podzapytania w UPDATE SET (serwer sql 2005)

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

Czy możliwe jest odwołanie się do głównej wartości tabeli (trips.guid) w podzapytaniach?

Kiedy próbuję użyć trips.guid pojawia się błąd:

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

Klauzula „select distinct miasto z poi” powrót więcej niż jedno miasto.

+0

Czy gwarantowane jest tylko 1 miasto w poi dla trip_guid (lub czy spodziewasz się, że jakoś sobie z tym poradzi)? –

+0

Istnieją co najmniej 2 miasta. Chodzi o to, aby umieścić wszystkie cytowania w jednym polu. – itdebeloper

+0

Twój przykład działa w Oracle. W przypadku serwera SQL pozostałe odpowiedzi mają zastosowanie. – Monstieur

Odpowiedz

28

Można spróbować czegoś podobnego

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, chociaż nie zgadzam się z formatowaniem - wstawiłoby "INNER JOIN" do następnej linii ;-) –

4

Można używać stałych i wartości z zewnętrzną wybrać w sub-select:

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

Nie wiemy, w jaki sposób tabele wyglądać, więc mogę tylko przypuszczać, że Distinct będzie pracować dla Ciebie tym sposób (zwracanie tylko jednego odrębnego city w pod-zapytaniu).

+4

Podzapytanie zostanie przerwane, jeśli zwróci więcej niż 1 rekord –

+0

@ Jimmie R. Houts: Poprawnie. Aktualizowałem swoją odpowiedź w momencie opublikowania komentarza, dziękuję! –

+0

Czy rzeczywiście próbowałeś tego, mówi ** Niepoprawna składnia w pobliżu 't'.** –

8

innej wersji.

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

znalazłem rozwiązanie - wystarczy przesunąć podzapytanie do UDF :)

UPDATE TRIPS 
    SET locations = getAllTripCity(guid); 

Mój kod źródłowy 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 

To wszystko, co trzeba zrobić - prace dobrze :)

0

Miałem ten sam problem co pierwszy plakat. Mój przypadek użycia był następujący: Jedna tabela zawierała datę i godzinę wydarzenia sportowego. Ponieważ otrzymuję informacje z różnych źródeł, zmieniłem schemat bazy danych, więc miałem wartość int dla czasu i daty (lub może tylko daty) dla daty wydarzenia sportowego.

To moje zapytanie:

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; 

Niektóre wyjaśnienia: Trzeba dać podkwerendę MatchStartTime inną nazwę inaczej otrzymasz ostrzeżenie/błąd z SQL Server. Musiałem również dodać MatchId, więc wiedziałem, że aktualizuję poprawny mecz. SportTypeId służy do oddzielania różnych dyscyplin sportowych w bazie danych.

Dzięki @astander za skierowanie mnie we właściwym kierunku. Bez jego stanowiska zmagałbym się trochę bardziej z rozwiązaniem tego problemu.