3

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

我有多个调查表;为简单起见,假设我有两个,一个来自 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 中表达我需要的连接操作?也就是说,使用映射表,有没有办法将以下内容转换为标准 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;

首先十分感谢!

4

2 回答 2

0

您基本上正在寻找一种将列名存储在表中并在将来的查询中使用这些列名的方法。不幸的是,我相信您需要使用动态 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 进行比较。

于 2012-05-23T17:27:50.880 回答
0

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

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 语句。

于 2012-05-23T17:29:48.780 回答