我有一张桌子叫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
这可能吗?
基本上,每一行的源表都可以不同
我有一张桌子叫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
这可能吗?
基本上,每一行的源表都可以不同
原则上可以使用左连接,但前提是您有一组固定的查找表(否则,您需要动态构建 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'
但正如其他答案中提到的,这通常表明您的数据库设计存在缺陷。
SQL 查询中的表名不能是动态的。你必须找到一种不同的方法来做到这一点。
使用 aStored Procedure
和/或 EXEC()。
我会说这通常是一个坏主意。即使可能,它基本上也会阻止优化器做很多事情(这会导致查询速度大大降低)。
我建议更改您的数据库设计以使您尝试做的事情更容易(考虑拥有一个您想要加入的表具有一对一映射的基表),而不是试图让它工作。
您可以使用联合,并使用表指针按列过滤。像这样的东西:
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'
尝试这样的事情:
VIEW
1)使用所有源表创建一个:
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