2010-04-06 19 views
10

Güncelleştirme ifadesinde alt sorgular kullanma hakkında bir sorum var. Benim örnek:alt sorguları

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

o alt sorgular ana tablo değeri (trips.guid) başvurmak için mümkün mü?

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

fıkra daha o tek kenti dön 'poi farklı olarak şehir seçin':

i hatası alıyorum trips.guid kullanmaya çalıştığınızda.

+0

Trip_guid için sadece 1 şehirde poi garantilidir (ya da bunu sizin için halletmesini bekliyor musunuz)? –

+0

En az 2 alıntı var. Buradaki fikir, tüm alıntıları bir alana yerleştirmektir. – itdebeloper

+0

Örneğiniz Oracle'da çalışır. SQL Server için diğer cevaplar geçerlidir. – Monstieur

cevap

28

Sen

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 - INNER JOIN 'i bir sonraki satıra koyar ;-) –

4

Sen dış gelen sabitleri ve değerleri kullanabilirsiniz seçtiğiniz alt select:

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

Biz tabloları gibi bakmak nasıl bilmiyorum, bu yüzden sadece Distinct sen misin için çalışacak varsayabiliriz yol (alt sorguda yalnızca bir tane farklı city döndürüyor).

+4

Alt sorgu, 1 kayıttan daha fazla döndürdüğü takdirde kesilir –

+0

@Jimmie R. Houts: Doğru. Cevabınızı yorumunuzu gönderdiğiniz anda güncelledim, teşekkürler! –

+0

Bunu gerçekten denediniz mi, ** diyor 't' yakınında yanlış sözdizimi.** –

8

Başka bir sürümü gibi bir şey deneyebilirsiniz.

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

çözüm bulundu - sadece UDF :)

için alt sorgu taşımak
UPDATE TRIPS 
    SET locations = getAllTripCity(guid); 

My UDF kaynak kodu: Ben yapmanız gereken tek şey

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 

- çalışır iyi :)

0

İlk posterle aynı sorunu yaşadım. Kullanım durumum şunlardı: Bir tablo, bir spor etkinliğinin Tarih ve Saatini içeriyordu. Farklı kaynaklardan bilgi aldığım için, veritabanının şemasını değiştirdim, bu yüzden spor etkinliğinin tarihi için zaman ve tarih (veya belki de tarih) için bir int değerine sahip oldum.

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; 

Bazı açıklama:

Bu benim sorgu Sen alt sorgu SQL Server bir uyarı/hata alıyorum aksi farklı bir ad MatchStartTime vermek zorunda. Ayrıca MatchId'yi eklemek zorunda kaldım, bu yüzden doğru Eşleştirmeyi güncellediğimi biliyordum. SportTypeId, veritabanındaki farklı sporları ayırmak için kullanılır.

Bana doğru yönde işaret ettiğin için @astander'e teşekkürler. Onun haberi olmadan, bu çözümle sonuçlanmak için biraz daha uğraşırdım.