2012-05-08 4 views
5

"표"에서 추가 정보를 가져올 테이블을 결정하는 데 사용되는 "플래그"역할을하는 열이 포함 된 테이블이 있습니다 (즉, 값 1은 table1에서 2를 가져옵니다. table2 등으로부터). 일반적으로 인덱스/키를 사용하여 테이블에 조인하면됩니다. 그러나 내가 참여할 수있는 테이블에는 별도의 테이블로 정규화 할 수있는 정보가 들어있어 어떤 테이블을 조인 할 것인지 결정하는 데 열을 사용하는 상황에 처하게됩니다.SQL 최적화 - 열 값을 기반으로 서로 다른 테이블 조인

여기 내 질문에,이 열에서 생성 된 값을 기반으로 다른 테이블을 결합하는 가장 효율적인 방법은 무엇입니까?

다음은 현재이 작업을 수행하는 방법을 알고있는 두 가지 방법입니다.

  1. 은 (조인 할 테이블을 결정하는 열 값을 포함) 내 기본 테이블의 정보를 당긴 다음 내 응용 프로그램의 코드를 통해 추가적인 쿼리를 보낼 : 나는 그들이하지 최적의 솔루션 모두 확신 나머지 정보를 얻으십시오.

  2. 모든 테이블의 열을 반환합니다 (미사용 일지라도). 그런 다음, 내 코드를 통해 필요하지 않은 테이블의 nulls를 무시하십시오.

+2

포인트 1은 어떻습니까?하지만 응용 프로그램 코드가 아닌 저장 프로 시저에 저장하십시오. –

답변

1

분명히 옵션 2가 아닙니다. 데이터가 필요 없다면 검색 할 필요가 없습니다. 단순한. 데이터가 필요 없으면 테이블 (특히 대형 테이블)에 가입하는 것이 매우 비효율적입니다. 옵션 1을 사용하거나 동적 SQL을 사용하여 쿼리를 작성할 수 있습니다. 그런 다음 몇 가지 테스트 사례를한데 모아 실행 계획을 실행하여 쿼리가 어떻게 수행되는지 확인합니다.

1

다른 테이블의 내용에 따라 UNION을 제안합니다. 반환되는 열은 각 쿼리에서 동일해야합니다.

SELECT table1.title, tabel2.text FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE table1.key='2' 
UNION 
SELECT table1.title, tabel3.text FROM table1 INNER JOIN table3 ON table1.id=table3.id WHERE table1.key='3' 

이 (가 스키마와 일치하는지 확인하기 위해 SQL을 미세 조정하고 실제로 나는에 추가 한 실수를 피하기 위해)

+0

각 테이블은 사용할 테이블을 알고 있으면 테이블을 함께 결합하는 데 사용할 키/인덱스를 제외하고 다른 열이 있습니다. – user1110302

+0

그럴 경우 각 테이블마다 하나씩 여러 쿼리를 만들어야 할 것입니다. 각 테이블의 행을 CAST 할 수 있기 때문에 모두 동일한 유형으로되어 있을까요? – andrewsi

+0

임시 테이블이있는 메모는 mysql에서 하위 쿼리/공용어에 두 번 이상 사용할 수 없습니다. – tipu

1

가 나는 그것이 가능하다고 생각 :

을 그래서 당신은 뭔가를 할 수 있습니다
create table a (id integer, flag boolean); 
create table b (id integer, value_b varchar(30)); 
create table c (id integer, value_c varchar(30)); 

insert into a values (1, true), (2, false); 
insert into b values (1, 'Val 1'), (2, 'Val 2'); 
insert into c values (1, 'C 1'), (2, 'C 2'); 

select a.id, 
     case when a.flag then b.value_b else c.value_c end AS value 
    from a 
    left join b using (id) 
    left join c using (id); 

try it out 수 있습니다.

이 물론

있는 거 제한 : 일부 값은 생략해야하는지 여부를 NULL의 가야하므로 열

  • 번호가 고정되어;
  • 각 열에 CASE ... END을 써야합니다.
  • 사전에 조인 된 모든 테이블을 알아야합니다.
  • 성능이 좋지 않을 수 있습니다.
+0

응답 해 주셔서 감사합니다. 그러나이 문제는 필자의 경우에는 효과가 없습니다.이 경우 열은 각 테이블마다 다르며 다른 언급과 같이 다른 테이블을 조인하고 일부 정보를 사용하지 않으면 즉시 성능이 저하됩니다. – user1110302

관련 문제