2012-12-26 2 views
-3

나는 왼쪽 조인 하나만 남겨 두거나 조인이 덜 필요한 나머지 조인을 모두 피할 수있는 방법을 알고 싶습니다.같은 테이블에서 여러 조인을 피할 수있는 방법은 무엇입니까?

select colums 
    FROM [SectionAUnresolved] a 
    left join sectionanotmarkedcounts sdirector 
    on a.director=sdirector.employee 

    left join sectionanotmarkedcounts s_rm 
    on a.rm=s_rm.employee 

    left join sectionanotmarkedcounts s_rep 
    on a.rep=s_rep.employee 

    left join sectionanotmarkedcounts s_css 
    on a.css=s_css.employee 

    left join sectionanotmarkedcounts s_Css2 
    on a.css2=s_Css2.employee 

귀하의 안내에 감사드립니다!

+2

현재 양식으로 대답 할 수 없습니다. –

+0

이러한 조인으로 무엇을하려고합니까? 결과에서 당신은 무엇을 기대합니까? – horgh

+0

데이터베이스의 테이블 구조 등에 대해 좀 더 자세히 설명해 줄 수 있습니까? 우리는 현재의 형태로 질문에 대답 할 수 없습니다. –

답변

2

직접 질문에 대답하려면 왼쪽에 조인 된 테이블에서 반환하는 데이터가 섹션 A에 확인 된 것과 같이 스키마가 변경 될 수 있습니다. 다음 중 하나를 사용하여이 작업을 수행 할 수 있습니다.

  1. 데이터를 해당 열에 직접 씁니다. 또는
  2. 는 질문에 많은 배경이 아닌 배치

이후에 업데이트 빈 열을 가졌어요. 따라서 특정 문제에 대한 절대적인 대답을 제시하는 것은 어렵습니다. 하지만 일반적으로 이것은 귀하의 질문에 대한 답변이 될 것입니다.

성능에 문제가있는 경우 키 필드의 인덱스 및/또는보기 (구체화 여부와 관계 없음) 및/또는 파티션 및 기타 여러 성능 향상 도구의 사용은 다음과 같습니다. 권장 사항.

업데이트이 그러나, 기록을하지 않는 곱 초래

select colums 
    FROM [SectionAUnresolved] a 
    left join sectionanotmarkedcounts [all] 
    on a.director=[all].employee 
    or a.rm=[all].employee 
    or a.rep=[all].employee 
    or a.css=[all].employee 
    or a.css2=[all].employee 

약간 잘못된 있지만 (필요 여부 등)

콘스탄틴 - Vasilcov의 아이디어는 좋은 가능성처럼 보였다 @ 문제는 응용 프로그램과 함께 나중에 피벗 할 수 있지만 어떤 관계가 사용되었는지에 대한 정보는 제공하지 않습니다. 따라서 스키마의 변경, SectionAUnresolved 테이블의 정규화가 필요합니다. 하나의 새 SectionAUnresolved_countTypes 테이블을 연결 -

  • ct.type는 {이사, RM, 담당자, CSS는, CSS2}
  • 는 "ct.Unresolvedid = a.id는"

    select ct.type, colums 
        FROM [SectionAUnresolved] a 
        left join SectionAUnresolved_countTypes ct 
        on ct.Unresolvedid = a.id 
        left join sectionanotmarkedcounts [all] 
        on ct.employee=[all].employee 
    

    SectionAUnresolved rows

조인을 2로 줄이고 조인 횟수를 늘리거나 스키마를 변경하지 않고 "countTypes"를 늘릴 수 있습니다.

업데이트 콘래드-는 Flix, 당신은 (위의 내 첫 번째 코드 참조) 반환 된 각 레코드에 사용 된 조인을 결정하는 case 문을 사용할 수 있습니다 @에

감사합니다. 이렇게하면 SecionAnnololved 테이블을 더 정상화 할 필요가 없지만 성능에 따라 그래야 할 수도 있습니다.

내 지식 케이스 문은 인덱싱되지 않으므로 최적화를 위해 구체화 된 뷰 인덱싱이 필요할 수 있습니다. 정규화는 여전히 더 나은 구조 개선이 될 것입니다, IMO.

+0

* 어떤 관계가 사용되었는지에 대한 정보는 제공되지 않지만 * 어떤 사례가 사용되었는지 결정하기 위해 일련의 사례 설명을 포함 할 수 있습니다. 예 : '예. a.director = [all] .employee THEN 1 ELSE 0 END director, a. rms = [all] .employee THEN 1 ELSE 0 END rm..' –

+0

이 추가되어 더 나은 형식이됩니다. '사례 1 조건 1 THEN 값 1 조건 2 조건 2 값 2 끝'과 유사하게 중첩 구조를 제거합니다. 자세한 예제는 [MSDN] (http://msdn.microsoft.com/en-us/library/ms181765.aspx)을 참조하십시오. 업데이트 : 방금 필드가 분리되어 있고 중첩 된 경우가 아니라는 사실을 깨달았습니다. 내 가정과 선호하는 접근 방식은 단일 필드의 응용 프로그램 계층에 열거 형 값을 반환하는 것입니다. – Todd

+0

나는 열거 된 값을 좋아하지만 director, rm, rep, css 및 cc2가 별도의 필드 또는 비트 필드 일 필요가있는 별개의 값인 것을 보장하지 않는 한. –

0

짧고 간단한 대답은 "아니오"입니다.

...원하는 데이터가 다른 행에 있으므로 원하는 데이터를 가져와야합니다. 주변을 둘러 볼 필요가 없습니다.

관련 문제