1

「tracking_table」と呼ばれる15個のテーブルの更新を追跡するテーブルがあります。15 個のテーブルすべてに対して 1 つのテーブルのみが必要だったので、「tracking_table」に 10 個の列を保持しました。これは、15 個のテーブルすべての列数の最大値です。

現在、tracking_table から、次の構造の特定のテーブルの特定の列で行われた最新の更新を取得できます。

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_info テーブルは次のようになります。

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 テーブルを表示したい。

行の値を元のテーブルの列の名前と値にマップするのを手伝ってください。

前もって感謝します。

4

1 に答える 1

3

これにはいくつかの方法があります。1 つの方法は、最初tracking_tableに値を行から列に変換する をピボットしてから、emp_infoテーブルで結合することです。

ピボット コードは次のようになります。

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'

SQL Fiddle with Demoを参照してください。これにより、テーブルとのデータ比較に使用できる行のデータが取得されemp_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;

SQL Fiddle with Demoを参照してください。これにより、最終結果が得られます。

| 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 |

CASEピボットは、次の式で集計関数を使用して記述することもできます。

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
于 2013-04-05T10:50:24.230 に答える