我想要结合两个表。 两列充当键,其余字段是值或属性。
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的Str1
和Str2
将使用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.val1
,a.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将是公共字段)。
答案 0 :(得分:1)
正如@wildplasser在评论中提到的那样,根本问题在于你经常"经常"向表A添加列。在关系数据库中,将列添加到现有表中不应该是常规的"操作。好的,有时 是必要的,但这应该是因为数据模型的变化。
列名称" val1"," val2"等等是可疑的。有许多方法可以以更加SQL的方式存储这些数据,其中一些方法取决于底层数据库的功能:
问题的近因是基于视图的定义。当视图定义时,*
将扩展到所有列。使用视图时不会发生此扩展。您可以通过查看存储在元数据中的视图列来轻松查看。
对基础表的更改不一定会导致视图被重新分析(尽管对基础表的更改可能会使视图无效)。
某些数据库允许在DDL(数据定义语言)上触发。如果您的数据库支持此类触发器,则实际上可以让数据库在添加新列时修改视图。或者,您可以在存储过程中包装DDL更改,并在添加新列时包括对视图的更改。