SQL:根据列数据加入不同的表

时间:2014-08-12 09:06:47

标签: sql

我的情况如下:

表:t_audit

row | colname | oldvalue | newvalue
===================================
1   | locid   | 001      | 002
2   | typeid  | 010      | 011

表:t_ref_audit

colname | desc        | link_table  | link_key  | link_desc
===========================================================
locid   | Location    | t_ref_loc   | locid     | loc_desc
typeid  | Type        | t_ref_type  | typeid    | type_desc

表:t_ref_loc

locid | type_desc
==================
001   | LOCATION A
002   | LOCATION B

表:t_ref_type

typeid | loc_desc
==================
010   | TYPE C
011   | TYPE D

从上面可以看出,第一个表是我的审计日志表,第二个表是参考表。第3和第4表是参考表。通过使用下面的简单SQL,我可以基于t_ref_audit表获得对列名的正确描述。

SELECT t_ref_audit.desc, t_audit.oldvalue, t_audit.newvalue
FROM t_audit, t_ref_audit
WHERE t_audit.colname = t_ref_audit.colname

我现在的问题是,t_audit.oldvalue和t_audit.newvalue上的列包含来自其他参考表(t_ref_loc& t_ref_type)的参考代码ID。我想根据t_ref_audit.link_desc中的列显示正确的描述,而不仅仅是ID,如下所示:

coldesc  | oldvalue   | newvalue
==================================
Location | LOCATION A | LOCATION B
Type     | TYPE C     | TYPE D

希望有人可以就此启发我。谢谢。

1 个答案:

答案 0 :(得分:1)

也许是这样的? (和newvalues的逻辑相同......)

SELECT
  t_ref_audit.desc,
  t_audit.oldvalue,
  t_audit.newvalue,
  case
    when link_table='t_ref_loc' then t_ref_loc.loc_desc
    when link_table='t_ref_type' then t_ref_type.type_desc
    else '???'
  end oldvalue_desc
FROM
  t_audit
  join t_ref_audit ON t_audit.colname = t_ref_audit.colname
  left join t_ref_loc on link_table='t_ref_loc' and oldvalue=locid
  left join t_ref_type on link_table='t_ref_type' and oldvalue=typeid
  • 逻辑仅适用于静态映射......
  • 我认为你混合了一些t_ref_loc / t_ref_type表及其标题。