0

我有一张桌子叫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

这可能吗?

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

4

5 回答 5

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'

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

于 2012-11-23T10:27:15.003 回答
0

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

于 2012-11-23T10:18:01.467 回答
0

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

我建议更改您的数据库设计以使您尝试做的事情更容易(考虑拥有一个您想要加入的表具有一对一映射的基表),而不是试图让它工作。

于 2012-11-23T10:18:27.973 回答
0

您可以使用联合,并使用表指针按列过滤。像这样的东西:

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'
于 2012-11-23T10:23:53.730 回答
0

尝试这样的事情:

VIEW1)使用所有源表创建一个:

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
于 2012-11-23T10:36:05.907 回答