有没有办法在表之间动态连接?
由于脊髓痨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
您需要动态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
提示。
这是一个第三方系统,我正在询问是否有加载到其中的N个表,并在另一个表中使用基于名称的引用。所以你说的是,我必须首先查询唯一的表名,然后使用*恐怖*光标? – Craig
@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
这种类型的问题通常** **反映了一个更深层次的设计问题或误解。如果您要发布您的原始问题 - 在原始应用程序空间(UoD)中,我们可能会提供更好的帮助。或不。 –
确实是'a.ID = aX.ID'? –
@craig,我会考虑如果第三方创建了这样一个糟糕的数据库设计,他们的软件可能同样设计得不好,我想尽可能使用更好的产品。这是一个无能的明显例子,我不会相信我的业务。 – HLGEM