2011-02-09 4 views
0

하위 쿼리 연결을 수행하는 다음 SQL 문이 있습니다. 당신이 알아 차리면, 그것은 FOR XML ..을 사용합니다 .. 음 .. 저에게 떨림을 조금줍니다 :: 나는 어떤 코드 냄새가 나는 것처럼 느낍니다.SQL Server 2008에서이 연결을 수행하는 더 좋은 방법이 있습니까?

SQL Server 2008에서 더 좋은 방법이 있습니까?

SELECT a.CityId AS LocationId, a.City, 
    STUFF(
     (SELECT ', ' + x.County 
     FROM [dbo].[CountiesView] x 
      INNER JOIN [dbo].[CityCounties] y ON x.CountyId = y.CountyId 
     WHERE y.CityId = a.CityId 
     FOR XML PATH ('')) 
    , 1, 2, '') 
FROM [dbo].[CitiesView] a 
    where a.StateCode = 'NY' 

은 무엇이 코드가하고있는 것은 뉴욕의 상태에 대한 모든 도시 (및 군)을 나열한다. 도시가 1 개 이상의 카운티에 존재할 수 있으므로 카운티 이름을 협의하고 싶습니다. 그렇지 않으면 카운티 당 1 개의 도시 행이 생깁니다 (나는 원하지 않습니다).

리팩터링 할 수 있습니까?

나는 COALESCE를 사용하려고했지만 운이 없었습니다.

+0

게시물 관련 테이블 샘플. – vonPryz

+0

아니요, ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 나는 그것을하는 가장 좋은 방법은 코드 냄새인가. –

답변

1

"더 나은"의 눈에 보는 사람. 나는 SQL Server 2005 이상에서 이것을 수행하는 더 좋은 방법을 보지 못했지만 열심히 보지 못했습니다.

가장 좋은 방법은 아마도 program your own aggregate function입니다. 나는이 쿼리를 오히려 유지하려고한다.

1

ORDER에 대해 신경 쓰지 않으므로 CLR 사용자 정의 집계를 사용하면됩니다. 그것은 잘 XML 방법보다 더 잘 수행 할 수 있으며 현재의 접근 방식은 카운티가 & 기호가 포함 된 경우도 처리하지 (또는 <>하지만 그 않을 것 같다!)

+0

그래, 나는 심지어 오늘 (내가이 지위를 만들기 전에) 그것을 밖으로 테스트하고 그것을 확인할 수있다. 그것이'XML PATH' 문법을 처음 보았을 때 가장 먼저 생각한 것입니다. (나는 그 질문을 더럽 히고 싶지 않았기 때문에 아무 말도하지 않았다.) –

관련 문제