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

问题描述:

由于脊髓痨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,我会考虑如果第三方创建了这样一个糟糕的数据库设计,他们的软件可能同样设计得不好,我想尽可能使用更好的产品。这是一个无能的明显例子,我不会相信我的业务。 – HLGEM

您需要动态SQL表之间动态地加入。

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

在任何情况下,你可以用一个视图

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提示。

+0

这是一个第三方系统,我正在询问是否有加载到其中的N个表,并在另一个表中使用基于名称的引用。所以你说的是,我必须首先查询唯一的表名,然后使用*恐怖*光标? – Craig

+0

@Craig - 查看我编辑的关于视图的建议。虽然我没有测试过这个想法。 –

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

要做这样的事情,您必须动态构建查询,并且您需要为A表中的每条记录分别查询,或者至少为每个不同的TableName值分别查询。

这是一个如何使用动态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