我有一张名为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
这可能吗?
基本上,每一行的源表都可以不同
答案 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