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

Cra*_*aig 2 sql t-sql join sql-server-2008

给定带有这些模式的选项卡 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')
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到以下几点?(伪代码)

SELECT A.Value1, X.Value2
FROM A INNER JOIN X ON A.TableName = X
Run Code Online (Sandbox Code Playgroud)

并产生:

Value1  Value2
Val1    Val74
Val2    Val39
Run Code Online (Sandbox Code Playgroud)

t-c*_*.dk 6

这是如何使用动态 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
Run Code Online (Sandbox Code Playgroud)

结果:

Value1     Value2
---------- ----------
Val1       Val74
Val2       Val39
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 5

您需要动态 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 ...
Run Code Online (Sandbox Code Playgroud)

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