动态sql从字段值动态创建列名

时间:2014-02-05 20:18:10

标签: sql sql-server dynamic

这是我的架构

表t1:

 x1    y1
  1     2

表t2:

 x2    y2
  1   'x1'
  2   'y2'

我需要使用动态SQL来连接这两个表,并且表t1的连接列应该由列 y2 的值决定。

我尝试了一个非常难看且无法工作的SQL,因为没有用。

select * from t1 join t2 t on t2.x2 = t1.(select y2 from t2 where x2=t.x2);

我是 dynamic SQL的新手,所以不知道如何实现这一目标。

P.S。 :上述值仅供参考。实际上,这两个表都是动态创建的,因此列名不必相同。此外,列号可能不同,因此旋转可能不是那么有用

2 个答案:

答案 0 :(得分:0)

您不需要动态SQL,on子句中的更多逻辑:

select *
from t1 join
     t2 t
     on t2.x2 = t1.x1 and t2.y2 = 'x1' or
        t2.x2 = t1.y1 and t2.y2 = 'y1';

答案 1 :(得分:0)

根据我的经验,这最好在程序级别处理(创建这些动态查询)。

您不知道表名,但这并不意味着您无法为动态名称创建商店(即另一个名为“tables_meta”的表,其中包含所有动态表的列表)。 / p>

同样,如果您希望动态表也包含动态字段,您可以创建一个表来存储创建的动态表和关联的动态字段之间的映射(“fields_meta”包含表和之间的一对多关联)它的动态领域。)

查询表名称的“meta”表,然后使用检索到的名称(以及类似字段)以编程方式构建查询,可以允许您针对动态对象运行任何想要的查询。

至于具体加入动态表,这样做假定您对导致有意义的连接的字段有一些了解。如果是这种情况,您可以创建动态表,但至少有一个包含有意义数据的静态字段,这样您就可以查询表的“tables_meta”,然后在程序中构建一个查询结果,以便加入你的表X在它的静态字段“join_here”上(从表meta重复读取得到Y)并在Y上加入它。“join_here”(静态字段)

非常粗略的示例sudo代码:

List<String> sql-getDynamicTables = "select table_name from tables_meta";<br />
(results in X, Y, Z...)

if(sql-getDynamicTables.size > 1) { (make sure we have stuff to join on)
    (Start building the query for the join)
    String sql-performJoin = "select * from" + sql-getDynamicTables.get(0);

    for( each additional database found ) {
         sql-performJoin += " join " + sql-getDynamicTables.get(index-i) + " on " + sql-getDynamicTables.get(index-i)+".staticField = "(or replace that with a separate variable containing the dynamic field)+ sql-getDynamicTables.get(0)".staticField, ";
    }
    (remove any trailing commas)
    (add any where clause or whatever modifications to the query)
    (run the query sql-performJoin)
}

同样,列名可能不一样,但您可以像查看动态表名一样查询它们,并使用它来构建查询,而不是“.staticField”或您选择的任何内容。

请确保您知道您加入的数据提供了有意义的加入。

正如笔记:动态SQL非常痛苦,并引入了很多注意事项(复制表名等)。如果你仍然对它有所了解,可能值得研究替代方案。