2010-04-06 4 views
10

하위 쿼리를 Update 문에 사용하는 것에 대한 질문이 있습니다. 내 예 :UPDATE SET (SQL Server 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

trip_guid에 대해 poi에 단 하나의 도시 만 보장됩니다 (또는 어떻게 든이 문제를 처리 할 것으로 예상됩니까?). –

+0

적어도 2 개의 인용문이 있습니다. 아이디어는 모든 인용을 하나의 필드에 넣는 것입니다. – itdebeloper

+0

예제는 Oracle에서 작동합니다. SQL Server의 경우에는 다른 대답을 적용 할 수 있습니다. – 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

두 개 이상의 레코드를 반환하는 경우 하위 쿼리가 중단됩니다. –

+0

@ Jimmie R. Houts : 정확함. 나는 당신이 당신의 코멘트를 게시 한 순간 내 대답을 업데이트하고있었습니다, 감사합니다! –

+0

실제로 이것을 시도 했습니까? ** 't'근처의 구문이 잘못되었습니다.** –

8

또 다른 버전처럼 뭔가를 시도 할 수 있습니다.

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

내가 해결책을 발견 - 단지 UDF :

에 하위 쿼리를 이동을
UPDATE TRIPS 
    SET locations = getAllTripCity(guid); 

내 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 

- 작품 괜찬 :)

0

나는 초기 포스터와 같은 문제가 있었다. 내 사용 사례는 다음과 같습니다. 스포츠 이벤트의 날짜 및 시간이 하나의 테이블에 포함되어 있습니다. 다른 소스에서 정보를 얻으므로 데이터베이스의 스키마를 변경하여 스포츠 이벤트의 날짜에 대해 시간과 날짜 (또는 날짜)에 대한 int 값을 갖게되었습니다.

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; 

일부 설명 :

이 내 쿼리입니다 당신은 하위 쿼리는 SQL 서버에서 경고/오류, 그렇지 않으면 다른 이름을 MatchStartTime주고있다. MatchId를 추가해야만 정확한 Match를 업데이트하고 있다는 것을 알았습니다. SportTypeId는 데이터베이스에서 다른 스포츠를 구분하는 데 사용됩니다.

@astander에게 올바른 방향으로 나를 가리켜 주셔서 감사합니다. 그의 포스트가 없었다면 나는이 해결책으로 끝내기 위해 좀 더 고투했을 것이다.