2010-04-06 7 views
10

मुझे अपडेट स्टेटमेंट में सबक्वायरीज़ का उपयोग करने के बारे में कोई प्रश्न है। मेरे उदाहरण:अद्यतन सेट में एसक्यूएल (एसक्यूएल सर्वर 2005)

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

यह सबक्वेरी में मुख्य तालिका मूल्य (trips.guid) का उल्लेख करना संभव है?

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

खंड अधिक है कि एक शहर लौट 'विशिष्ट शहर poi से चुनें':

जब मैं trips.guid उपयोग करने के लिए मैं त्रुटि मिलती है की कोशिश करो।

+0

क्या ट्रिप_गुइड के लिए poi में केवल 1 शहर होने की गारंटी है (या आप इसे किसी भी तरह से संभालने की उम्मीद कर रहे हैं)? –

+0

कम से कम 2 साइटें हैं। विचार सभी स्थानों को एक क्षेत्र में रखना है। – itdebeloper

+0

आपका उदाहरण ओरेकल में काम करता है। SQL सर्वर के लिए अन्य उत्तर लागू हैं। – Monstieur

उत्तर

28

आप की तरह

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' को अगली पंक्ति में डाल देगा ;-) –

4

आप बाहरी से स्थिरांक और मूल्यों का उपयोग कर सकते में चयन उप-चयन:

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

हम अपने टेबल की तरह लग रही है कि कैसे पता नहीं है, इसलिए मैं केवल यह मान सकते हैं कि Distinct आपको लगता है कि के लिए काम करेंगे रास्ता (सब-क्वेरी में केवल एक विशिष्ट city लौटा रहा है)।

+4

यदि यह 1 से अधिक रिकॉर्ड –

+0

@Jimmie R Houts: सही है तो सबक्वायरी तोड़ देगा। जब आप अपनी टिप्पणी पोस्ट करते हैं, तो मैं अपना जवाब अपडेट कर रहा था, धन्यवाद! –

+0

क्या आपने वास्तव में यह कोशिश की, यह कहता है ** 'टी' के पास गलत वाक्यविन्यास।** –

8

एक और संस्करण कुछ कोशिश कर सकते हैं।

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

मैं समाधान नहीं मिला - बस यूडीएफ :)

को सबक्वेरी के लिए कदम
UPDATE TRIPS 
    SET locations = getAllTripCity(guid); 

मेरे यूडीएफ के स्रोत कोड:

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

मुझे प्रारंभिक पोस्टर के समान समस्या थी। मेरा उपयोग केस निम्न था: एक तालिका में एक खेल आयोजन की तिथि और समय शामिल था। क्योंकि मुझे विभिन्न स्रोतों से जानकारी मिल रही है, मैंने डेटाबेस की स्कीमा बदल दी है, इसलिए खेल आयोजन की तारीख के लिए मेरे पास समय और डेटाटाइम (या शायद तारीख) के लिए एक मूल्य था।

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 सर्वर से एक चेतावनी/त्रुटि मिलती है देना है। मुझे भी मैचआईड जोड़ना पड़ा, इसलिए मुझे पता था कि मैं सही मैच अपडेट कर रहा था। SportTypeId डेटाबेस में विभिन्न खेलों को अलग करने के लिए उपयोग किया जाता है।

सही दिशा में मुझे इंगित करने के लिए @astander के लिए धन्यवाद। अपनी पोस्ट के बिना मैं इस समाधान के साथ समाप्त होने के लिए थोड़ा और संघर्ष करूँगा।