有没有办法在表之间动态连接?

时间:2011-08-29 09:28:40

标签: sql tsql sql-server-2008 join

给定标签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 个答案:

答案 0 :(得分:3)

您需要动态SQL才能在表之间动态连接。

如果你有100个不同的表具有相同的模式,你确定它们不应该全部合并到一个带有“type”字段的表中吗?

无论如何,你可以用视图模拟这个

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

您需要检查SET STATISTICS IO ON的执行计划和输出,以确保您的查询没有触及不必要的表。您可能需要RECOMPILE提示。

答案 1 :(得分: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

答案 2 :(得分:0)

您不能在查询中将数据用作表名。此外,您尝试做的不是连接,它将是子查询,因为表A中的每个记录都可以使用不同的表。

要执行类似的操作,您必须动态构建查询,并且需要为A表中的每个记录单独查询,或者至少为每个不同的TableName值分别查询。