2013-03-19 5 views
2

모든 조합에 대해 알고 있습니다. 모든 질문에 많은 질문이 있지만, 약간의 차이가 있습니다. 세 가지 다른 쿼리/테이블 세트에서 모두 유니온을 수행 할 것입니다. 첫 번째 2는 쿼리의 정의에 따라 중복되는 항목이 없지만 세 번째 항목에는 중복 된 항목이있을 것입니다.유니온 모두 - 3 테이블, 2는 중복을 포함하지 않으며, 다른 것은

내 질문은 내 노조/노동 조합 명령과 관련이 있는지입니다. 예를 들어, 중복이 없으므로 첫 번째 2 개 테이블에 대해 UNION ALL을 수행하고 중복이 있으므로 세 번째 테이블에 UNION을 수행해야합니까? 또는 그 반대의 경우 주문이 더 좋습니까? 또는 그것은 중요하지 않습니까?

이 시나리오에서는 모범 사례가 있는지 궁금하지 않습니다.

+0

당신은 어떤 관점에서 왔습니까? 성능 향상을 위해 노력하고 있습니까? – mellamokb

+0

성능, 모범 사례 등을 제공하십시오. 사용자는이 인터페이스를 많이 사용하므로 성능이 중요하지만 가능할 때마다 "올바른 방법"으로 작업하고 싶습니다. –

답변

3

UNION ALL은 추가 처리없이 모든 행을 반환합니다. 간단한 UNION은 전체 행 집합을 정렬하여 중복을 제거합니다. 옵티마이 저가 인덱스와 제약 조건을 연구함으로써 모든 것을 알아낼 수있을 수 있지만, 당신은 항상 이런 식으로 좀 도와 줄 수 있습니다

select * from table1 
union all 
    select * from table2 
union all 
    select * 
    from (
    SELECT DISTINCT * from table3 
) T 

를이 정렬 - 및 - 제거 - 중복에서만 수행되도록 보장 table3.

언제든지 인간 사용자와 컴파일러 모두에게보다 편리하고 명확하게 의사 소통 할 수 있습니다. 코드를 작성하는 올바른 방법입니다. 이 경우 성능이 향상 될 수 있으며 성능이 저하 될 수 없습니다.

+0

흥미를 자아냅니다. 그래서 이것은 'select * from table1 union from select * from table3 union select * from table3' –

+0

라고 말하기보다 효과적입니다. 앞에서 언급했듯이 옵티마이 저는 적절한 인덱스와 제약 조건이 존재하면 모든 것을 계산할 수 있습니다. 또한 UNION 연산자의 연관성을 확인하여 용도에 원하는 효과 (공급 업체에 따라 다를 수 있음)가 있는지 확인해야합니다. 그러나 위의 코드는 코드의 사람과 컴퓨터 사용자 모두에게 의도가 명확하도록 보장하므로 올바른 "구현"이라고 할 수 있습니다. ( –

+2

언제든지 사용자와 컴파일러 모두에게 언제든지 간단하고 명확하게 의사 소통 할 수 있습니다. 코드를 작성하는 올바른 방법이 될 수 있습니다.이 경우 성능이 향상 될 수 있으며 성능이 저하 될 수 없습니다. –