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)
这是如何使用动态 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)
您需要动态 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提示。