当要连接的表是列中的变量时,如何连接表

时间:2012-11-23 10:11:32

标签: sql

我有一张名为Table1的表。

该表包含以下列:

  • sourceID(加入的ID
  • sourceTable(要加入的表格,这是可变的)

我的查询:

SELECT T.Category, J.Tariff
FROM Table1 as T
INNER JOIN T.SourceTable J ---- This needs to be changed
ON T.sourceID = J.id

这可能吗?

基本上,每一行的源表都可以不同

5 个答案:

答案 0 :(得分:0)

表名在SQL查询中不能是动态的。你必须找到一种不同的方法来做到这一点。
使用Stored Procedure和/或EXEC()。

答案 1 :(得分:0)

我说这通常是一个坏主意。即使可能,它基本上会阻止优化器做很多事情(这可能导致查询速度减慢)。

我建议你改变你的数据库设计,使你想要做的事情变得更容易(想想有一个基表,你要加入的表有一对一的映射),而不是试图让它到工作

答案 2 :(得分:0)

您可以使用Union,并使用表指针过滤列。像这样:

SELECT T.Category, J.Tariff
FROM Table1 as T
INNER JOIN T.SourceTable1 J ON T.sourceID = J.id
where T.sourceTable = '1'
union
SELECT T.Category, J.Tariff
FROM Table1 as T
INNER JOIN T.SourceTable2 J ON T.sourceID = J.id
where T.sourceTable = '2'

答案 3 :(得分:0)

原则上可以使用左连接,但前提是你有一组固定的查找表(否则,你需要动态构建你的SQL语句):

SELECT T.Category, coalesce(source1.tariff, source2.tariff) as tariff
FROM Table1 as T
LEFT OUTER JOIN T.source1 
  ON T.sourceID = source1.id and t.sourcetable = 'source1'
LEFT OUTER JOIN T.source2 
  ON T.sourceID = source2.id and t.sourcetable = 'source2'

但正如其他答案所述,这通常表明您的数据库设计存在缺陷。

答案 4 :(得分:0)

尝试这样的事情:

1)创建一个包含所有源表的VIEW

CREATE VIEW source_tables AS
(SELECT 'table_1' as table_name,
        id,
        value
 FROM table_1
 UNION ALL
 SELECT 'table_2' as table_name,
        id,
        value
 FROM table_2
 UNION ALL
 ..........
 SELECT 'table_n' as table_name,
        id,
        value
 FROM table_n);

2)使用VIEW从源表中获取值:

SELECT T.category, S.value
FROM base_table as T
JOIN source_tables S ON T.sourceID = S.id AND T.SourceTable = S.table_name