【问题标题】:sql join functionsql连接函数
【发布时间】:2012-05-30 06:48:36
【问题描述】:

这基本上是一个数据库连接问题,但它需要使用列名到列名的映射组件,这让我很困惑。

我有多个调查表;为简单起见,假设我有两个,一个来自 2010 年(称为“d2010”),另一个来自 2011 年(称为“d2011”)。行对应于调查,列(我们可以假设命名为'c1'、'c2'、'c3'、...'cN')对应于对问题的回答。所以,'d2010' 看起来像

         id  c1  c2  c3  .. cX
survey 1
survey 2
survey 3
...
survey N

虽然“d2011”看起来像

         id  c1  c2  c3  .. cY
survey 1
survey 2
survey 3
...
survey N

主要目标是显示从 2010 年到 2011 年针对特定问题的回答有何变化。具体来说,我的目标是创建 SQL 命令来创建新表(包含三列),以针对特定响应显示两年之间的调查有何不同:

         id  2010-response  2011-response
survey 1
survey 2
survey 3
...
survey N

如果列名保持一致,那么我需要的只是一些简单的东西

select d2011.id, d2010.c1 as 'last year', d2011.c1 'this year' from d2010 join d2011 on d2010.id=d2011.id;

不幸的是,创建表的人没有保持列名一致;例如,

c1 of 2010 corresponds to c2 of 2011
c2 of 2010 corresponds to c1 of 2011
c3 of 2010 corresponds to c3 of 2011
c4 of 2010 corresponds to c7 of 2011
...

所以我一直在尝试做的是输入类似的东西

select d2010.id, d2010.c1 as 'last year', d2011.f(c1) 'this year' from d2010 join d2011 on d2010.id=d2011.id;

其中“d2011.f(c1)”表示使用将 2010 年的列名映射到 2011 年的列名的函数。映射不够简单,无法用数学公式表示,所以我假设我需要一个表就像

2010  2011
  c1    c2
  c2    c1
  c3    c3
  c4    c7

有没有办法在 SQL 中表达我需要的连接操作?也就是用map表,有没有办法把下面的转换成标准SQL(一般)和SQLite(特别)?

select d2011.id, f(d2010.c1) as 'last year', d2011.c1 'this year' from d2010 join d2011 on d2010.id=d2011.id;.id;

提前非常感谢!

【问题讨论】:

    标签: sql function join


    【解决方案1】:

    您基本上要寻找的是一种将列名存储在表中的方法,并在以后的查询中使用这些列名。不幸的是,我相信您需要使用动态 SQL。一个例子:

    declare @SQL nvarchar(1024)
    set @SQL = 'select * from Table'
    exec sp_executeSQL @SQL
    

    因此,使用您的映射表,可以返回“映射”列名并声明您的连接:

        declare @SQL nvarchar(1024)
        declare @mappedColumnName nvarchar(1024)
    
        select @mappedColumnName = 2011 from mappedTable where 2010 = 'c1'
    
        set @SQL = 'select *
        from d2010 join d2011 on d2010.id=' + @SQL + ';.id';
    
        exec sp_executeSQL @SQL
    

    我最近使用的另一种方法是 .NET 中的实体框架。这允许您使用反射在 LINQ 查询中动态选择列名。

    这两种方法对我来说都是“肮脏的”,但这是对设计这些表格的人的反映。最好将它们导出到 Excel 中进行比较。

    【讨论】:

      【解决方案2】:

      您的问题似乎并不完全清楚。 . .你可以这样加入:

      select d2011.id, d2010.c2 as 'last year', d2011.c1 'this year'
      from d2010 join d2011 on d2010.id = d2011.id
      

      没有办法在标准 sql 中动态指定列。动态 SQL 确实为您提供了这种能力。

      我怀疑您想要做的最简单的方法是将两个表格列列表导入 Excel,将它们并排放入两列,然后使用 Excel 函数构建 SQL 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 2017-06-22
        • 2015-03-19
        相关资源
        最近更新 更多