给定标签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
答案 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
值分别查询。