【问题标题】:is there a way to dynamically join between tables?有没有办法在表之间动态连接?
【发布时间】:2011-11-05 21:36:12
【问题描述】:

给定具有以下架构的表 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

【问题讨论】:

  • 这类问题通常反映了更深层次的设计问题或误解。如果您要发布您的原始问题——在原始应用程序空间 (UoD) 中措辞——我们可能会提供更好的帮助。或者不。
  • a.ID = aX.ID 是真的吗?
  • @craig,我会考虑如果第三方创建了如此糟糕的数据库设计,他们的软件可能同样设计糟糕,如果可能的话,我会得到更好的产品来使用。这是一个明显的无能案例,我不会相信我的生意。

标签: sql tsql sql-server-2008 join


【解决方案1】:

您需要动态 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 提示。

【讨论】:

  • 这是我正在询问的第三方系统,其中加载了 1-N 个表,在另一个表中具有基于名称的引用。所以你的意思是我必须先查询唯一的表名,然后使用 horror 游标?
  • @Craig - 查看我编辑过的关于视图的建议。不过我还没有测试过这个想法。
【解决方案2】:

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

结果:

Value1     Value2
---------- ----------
Val1       Val74
Val2       Val39

【讨论】:

    【解决方案3】:

    您不能在查询中使用数据作为表名。此外,您要做的不是连接,而是子查询,因为表 A 中的每条记录都可以使用不同的表。

    要执行类似的操作,您必须动态构建查询,并且您需要为 A 表中的每条记录单独查询,或者至少为每个不同的 TableName 值单独查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2016-07-09
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多