2010-07-20 5 views
1

여기서 가장 좋은 방법이라고 생각하는 사람이 있습니까? 기본적으로 [lookup] 테이블에서 참조하는 약 30 개의 SQL 테이블이 있습니다. [조회] 테이블의 각 행에 대해 다른 테이블 [FinalTable]에 삽입해야합니다. 이제 [lookup] 테이블은 다음과 같이 보입니다.SQL : 여러 테이블에서 선택하고 삽입하는 가장 좋은 방법

ID, Zipcode, tableID 
1, 60453, 1 
2, 90210, 1 
3, 60453, 2 
4, 60625, 3 
5, 60625, 4 
6, 60625, 4 
7, 60625, 5 

데이터를 가져올 필요가있는 30 개의 테이블 중 어떤 테이블인지 알 수있는 tableID가 있습니다. 그런 다음 zipcode를 사용하여 해당 테이블에서 select를 수행하고 반환되는 데이터 세트를 삽입하십시오.

커서를 사용하여 [lookup] 테이블의 각 행을 살펴 보았을 때 가장 좋은 방법은 무엇입니까? 효율성과 빠른 쿼리 측면에서. SQL 문에서 동적으로 테이블을 선택하는 방법은 무엇입니까? [lookup] 테이블은 약 1k 행의 데이터를 가지며 앞으로는 많이 늘어나지 않을 것입니다. 그러나이 전체 선택 및 삽입 과정은 월 단위로 반복되어야합니다. 너희들이 생각하는 것을 나에게 알려줘. 감사.

나는 모든 접근법을 가지고 있습니다. 불행히도, 나는 처분에 SQL 만 있습니다. 다른 것을 사용할 수 없습니다.

  1. 다른 테이블 및 삽입을 선택하기 위해 if-else 문에 모든 것을 넣으시겠습니까?
  2. 사용 사례 전환문?
  3. 각 테이블마다 30 개의 procs가 저장됩니까?

나는 디자인을 변경하고 싶지만 불행하게도 30 개의 분리 된 테이블은 클라이언트의 DB에서 방금 업로드 한 기본 CSV 플랫 파일에서 가져옵니다. 동일한 우편 번호가 여러 테이블에 나타나고 데이터를 가져 오는 테이블을 기반으로 삽입을 수행해야합니다. 안됐다. 내가 어떻게 고칠 수 있니?

이 데이터베이스 설계 감안할 때
+1

저는 개인적으로 디자인을 지금 바꿀 것입니다. 시간이 지나면 잘 작동 할 디자인이 아닙니다. – HLGEM

+0

디자인을 변경하고 싶지만 불행하게도 30 개의 분리 된 테이블은 클라이언트의 DB에서 방금 업로드 한 기본 CSV 플랫 파일에서 가져옵니다. 동일한 우편 번호가 여러 테이블에 나타나고 데이터를 가져 오는 테이블을 기반으로 삽입을 수행해야합니다. – stevenjmyu

답변

1

, 나는 예를 들어, 30 개 쿼리, 각 테이블을 작성합니다 다른 30 개 각 테이블에 대한

SELECT ... 
FROM lookup l JOIN table15 t ON l.zipcode = t.zipcode 
WHERE l.tableID = 15 

와 유사합니다. 이것은 아마도 가장 간단하고 유지 보수가 용이 한 솔루션 일뿐만 아니라 최상의 성능을 제공 할 수도 있습니다. 모든 작업을 단일 쿼리로 수행해야하는 것은 아닙니다.

@ HLGEM의 의견에 동의합니다. 따라서 30 개의 별도 테이블이 없도록 다시 디자인하는 것이 좋습니다. 이 디자인의 냄새는 Metadata Tribbles antipattern입니다.

0

@HLGEM의 의견에 완전히 동의합니다. 문제가 발생하면 길을 걷고 있습니다.

그러나 그녀는 작동 할 수있는 SQL 구문입니다.

INSERT INTO [FinalTable] ({list of columns for [FinalTable]} 
SELECT {List of columns for [FinalTable]} 
FROM [lookup] 
LEFT OUTER JOIN [Table1] ON [lookup].[Zipcode] = [Table1].[Zipcode] AND [lookup].[tableID] = 1 
LEFT OUTER JOIN [Table2] ON [lookup].[Zipcode] = [Table2].[Zipcode] AND [lookup].[tableID] = 2 
LEFT OUTER JOIN [Table3] ON [lookup].[Zipcode] = [Table3].[Zipcode] AND [lookup].[tableID] = 3 
LEFT OUTER JOIN [Table4] ON [lookup].[Zipcode] = [Table4].[Zipcode] AND [lookup].[tableID] = 4 
LEFT OUTER JOIN [Table5] ON [lookup].[Zipcode] = [Table5].[Zipcode] AND [lookup].[tableID] = 5 

-- LEFT OUTER JOIN other tables 

LEFT OUTER JOIN [Table30] ON [lookup].[Zipcode] = [Table30].[Zipcode] AND [lookup].[tableID] = 30 
관련 문제