2011-08-29 3 views
1

감안할 때 척수 A와 A1 - 이러한 스키마와 A100 : 내가 할 수있는 방법은 다음테이블간에 동적으로 조인하는 방법이 있습니까?

CREATE Table A(
ID INT NOT NULL, 
Value1 VARCHAR(10) NOT NULL, 
TableName VARCHAR(4) NOT NULL 
) 

INSERT INTO A 
(1, 'Val1', 'A1'), 
(2, 'Val2', 'A5') 

CREATE TABLE A1(--and same for tables A2 - A100 
ID INT NOT NULL, 
Value2 VARCHAR(10) NOT NULL 
) 

INSERT INTO A1 
(1, 'Val74') 
INSERT INTO A5 
(1, 'Val39') 

? (의사 코드)

SELECT A.Value1, X.Value2 
FROM A INNER JOIN X ON A.TableName = X 

그리고 생산 :

Value1 Value2 
Val1 Val74 
Val2 Val39 
+3

** 보통 ** 훨씬 더 깊은 디자인 문제 나 오해를 반영하는이 유형의 질문. 원래의 응용 프로그램 공간 (UoD)에 원래의 문제를 게시하려면 조금 더 잘 할 수 있습니다. 아니. –

+0

'a.ID = aX.ID'는 사실입니까? –

+1

@craig, 나는 제 3자가 그러한 가난한 데이터베이스 디자인을 만든다면, 그들의 소프트웨어가 아마도 똑같이 잘못 설계되어 가능한 한 더 나은 제품을 사용할 수 있다고 생각할 것입니다. 이것은 무능력의 명백한 경우이고 나는 그것에 나의 사업을 신뢰하지 않을 것입니다. – HLGEM

답변

3

는 동적 테이블 간의 조인 동적 SQL을해야합니다.

동일한 스키마를 가진 100 개의 다른 테이블이 있다면 "유형"필드가있는 하나의 테이블로 통합해서는 안됩니다.

어떤 경우에도 당신은보기 당신은 당신의 쿼리가 불필요한 테이블을 접촉되지 않았 음을 확신 할 수있는 실행 계획 및 SET STATISTICS IO ON의 출력을 확인해야합니다

CREATE VIEW AView 
AS 
SELECT 'A1' AS name , ID, Value2 
FROM A1 
UNION ALL 
SELECT 'A2' AS name , ID, Value2 
FROM A2 
UNION ALL ... 

이것을 시뮬레이션 할 수 있습니다. RECOMPILE 힌트가 필요할 수 있습니다.

+0

그것은 다른 테이블에 이름 기반 참조와 함께로드 된 1-N 테이블이있는 질문하는 제 3 자 시스템입니다. 그래서 당신이 말한 것은 고유 한 tablenames에 대해 먼저 쿼리해야한다는 것입니다. * horror * cursor? – Craig

+0

@Craig - 내 수정 된 제안보기. 나는이 생각을 테스트하지 않았다. –

0

쿼리에서 테이블 이름으로 데이터를 사용할 수 없습니다. 게다가, 테이블 A의 각 레코드가 다른 테이블을 사용할 수 있기 때문에 수행하려는 작업은 조인이 아니며 하위 쿼리가됩니다.

쿼리를 동적으로 작성해야하며 A 테이블의 각 레코드에 대해 별도의 쿼리가 필요하거나 각각의 고유 한 TableName 값에 대해 별도의 쿼리가 필요합니다.

3

이것은 동적 SQL을 사용하여 쿼리를 작성하는 방법의 완벽한 예입니다. 현재 설정으로 가능한 최상의 성능을 제공하며 읽기 쉽습니다.

DECLARE @sql varchar(max) 
SELECT @sql = coalesce(@sql + ' UNION ALL ', '')+'SELECT A.Value1, '+tablename+'.Value2 FROM A INNER JOIN '+ tablename + ' ON A.TableName = '''+tablename +'''' 
FROM A 

EXEC(@sql) 

결과 :

Value1  Value2 
---------- ---------- 
Val1  Val74 
Val2  Val39 
관련 문제