Sql server 将一个表的行值映射到另一个表的列名
我有一个表,它跟踪15个表的更新,称为“跟踪表”。 因为我只需要15个表中的一个表,所以我在“tracking_table”中保留了10列,这是所有15个表中COL数的最大值 现在,通过跟踪表,我可以在下面的结构中获得对特定表的特定列的最新更新Sql server 将一个表的行值映射到另一个表的列名,sql-server,tsql,Sql Server,Tsql,我有一个表,它跟踪15个表的更新,称为“跟踪表”。 因为我只需要15个表中的一个表,所以我在“tracking_table”中保留了10列,这是所有15个表中COL数的最大值 现在,通过跟踪表,我可以在下面的结构中获得对特定表的特定列的最新更新 p_key_no col_name value table __________________________________________________________________ 1 AL
p_key_no col_name value table
__________________________________________________________________
1 ALTEMAIL abc@gmail.com emp_info
1 PASSWORD AA321 emp_info
2 ALTEMAIL xyz@gmail.com emp_info
2 EMAIL pqr@yahoo.com emp_info
2 PASSWORD SB12321 emp_info
这将跟踪表名、列名、特定行的主键值及其更改的值
emp_信息表如下所示:
PKEY EMAIL FULLNAME PASSWORD TIME_STAMP ALTEMAIL
1 a123@xyz.com xyz1 AA123 2013-04-05 13:24:49.650 aaa@gmail.com
2 b123@xyz.com xyz2 BB123 2013-04-05 13:24:49.650 bbb@gmail.com
3 c123@xyz.com xyz3 CC123 2013-04-05 13:24:49.650 ccc@gmail.com
我只想用特定列的更新值显示emp_info表
所以,请帮助我将行值映射到原始表的列名和值
提前感谢。这可以通过几种不同的方式完成,其中一种方式是首先旋转
跟踪表
,该表将值从行转换为列,然后连接到emp\u信息
表
透视代码将类似于以下内容:
select p_key_no, ALTEMAIL, PASSWORD, EMAIL
from tracking_table
pivot
(
max(value)
for col_name in (ALTEMAIL, PASSWORD, EMAIL)
) p
where [table] ='emp_info'
看。这将获取行中的数据,可用于与emp\u info
表进行数据比较。最终代码类似于:
;with cte as
(
select p_key_no, ALTEMAIL, PASSWORD, EMAIL
from tracking_table
pivot
(
max(value)
for col_name in (ALTEMAIL, PASSWORD, EMAIL)
) p
where [table] ='emp_info'
)
select e.pkey,
coalesce(c.email, e.email) email,
e.fullname,
coalesce(c.password, e.password) password,
time_stamp,
coalesce(c.altemail, e.altemail) altemail
from emp_info e
left join cte c
on e.pkey = c.p_key_no;
看。这给出了一个最终结果:
| PKEY | EMAIL | FULLNAME | PASSWORD | TIME_STAMP | ALTEMAIL |
------------------------------------------------------------------------------------
| 1 | a123@xyz.com | xyz1 | AA321 | 2013-04-05 13:24:49 | abc@gmail.com |
| 2 | pqr@yahoo.com | xyz2 | SB12321 | 2013-04-05 13:24:49 | xyz@gmail.com |
| 3 | c123@xyz.com | xyz3 | CC123 | 2013-04-05 13:24:49 | ccc@gmail.com |
还可以使用带有大小写
表达式的聚合函数编写枢轴:
select p_key_no,
max(case when col_name = 'ALTEMAIL' then value end) ALTEMAIL,
max(case when col_name = 'PASSWORD' then value end) PASSWORD,
max(case when col_name = 'EMAIL' then value end) EMAIL
from tracking_table
where [table] ='emp_info'
group by p_key_no
谢谢@bluefeet,但我不想硬编码bcoz有15个表,它们的列数不同,名称也不同。@Rohit每次都要传入表名吗?由于要在同一个更新表中存储15个不同的表,这将非常困难,因此必须使用动态SQL解决方案。让我看看我能想出什么。是的,我将把总解决方案转换为SP,并将表名作为参数传递。。谢谢:)