INNER JOIN表没有重命名字段

时间:2017-10-18 09:58:53

标签: sql join inner-join

源表结构

我想要结合两个表。 两列充当键,其余字段是值或属性。

TABLE A (Has both KeyA and KeyB) :
KEYA | KEYB | Val1 | Val2 | Val3 | ... | ValN
---------------------------------------------
keyA1| keyB1|  V11 |  V12 |  V13 | ... |  V1n 
keyA1| keyB2|  V21 |  V22 |  V23 | ... |  V2n
keyA1| keyB3|  V11 |  V12 |  V13 | ... |  V1n
              ....
keyAm| keyB1|  Vm1 |  Vm2 |  Vm3 | ... |  Vmn


Table B (only keyA present):
KEYA |  Str1  |   Str2 
----------------------
keyA1|  str11 |  str12 
keyA2|  str21 |  str22
        ....
keyAm|  strm1 |  strm2

需要的结果表结构

我想把这两个表组合起来 来自TABLEB的Str1Str2将使用KeyA映射到TABLEA。

TABLE C (contains both KeyA and KeyB) :
KEYA | KEYB | Val1 | Val2 | Val3 | ... | ValN |     Str1 | Str2
------------------------------------------------------------------
keyA1| keyB1|  V11 |  V12 |  V13 | ... |  V1n |    str 11| str 12
keyA1| keyB2|  V21 |  V22 |  V23 | ... |  V2n |    str 11| str 12
keyA2| keyB3|  V11 |  V12 |  V13 | ... |  V1n |    str 21| str 22
              ....
keyAm| keyB1|  Vm1 |  Vm2 |  Vm3 | ... |  Vmn |    str m1| str m2

问题

有时,新值字段(Val n)会添加到表A中,但表B的架构保持不变。 如果我像这样组合表 -

create TABLEC as
select a.*, b.Str1 as Str1, b.Str2 as Str2 from
TABLEA a INNER JOIN TABLEB b ON a.keyA=b.keyA

结果表的字段名称为a.val1a.val2等。

这是我目前使用的

create TABLEC as
select a.Val1 as Val1,
a.Val2 as Val2,
  ...
a.Valn as Valn,    

b.Str1 as Str1,
b.Str2 as Str2
from TABLEA a INNER JOIN TABLEB b ON a.keyA=b.keyA

每次添加额外的Val字段时,我都必须修改代码。有没有办法直接创建TABLEC,以便保留TABLEA和TABLEB中的字段名称(keyA将是公共字段)。

1 个答案:

答案 0 :(得分:1)

正如@wildplasser在评论中提到的那样,根本问题在于你经常"经常"向表A添加列。在关系数据库中,将列添加到现有表中不应该是常规的"操作。好的,有时 是必要的,但这应该是因为数据模型的变化。

列名称" val1"," val2"等等是可疑的。有许多方法可以以更加SQL的方式存储这些数据,其中一些方法取决于底层数据库的功能:

  • 使用联结表。
  • 使用实体 - 属性 - 值数据模型(或更可能是混合)。
  • 使用JSON或XML列存储列表。
  • 使用数组。
  • 使用嵌套表。

问题的近因是基于视图的定义。当视图定义时,*将扩展到所有列。使用视图时不会发生此扩展。您可以通过查看存储在元数据中的视图列来轻松查看。

对基础表的更改不一定会导致视图被重新分析(尽管对基础表的更改可能会使视图无效)。

某些数据库允许在DDL(数据定义语言)上触发。如果您的数据库支持此类触发器,则实际上可以让数据库在添加新列时修改视图。或者,您可以在存储过程中包装DDL更改,并在添加新列时包括对视图的更改。