Sql server 选择由另一个表中的另一列命名的列

Sql server 选择由另一个表中的另一列命名的列,sql-server,postgresql,join,Sql Server,Postgresql,Join,我正在实现一个支持角色扮演游戏的数据库。有两个相关的表:角色和武器(加上第三个表,表示标准的多对多关系;加上武器的每个特定实例的级别)。角色有多个属性(力量、敏捷、魔法等),每件武器都有一个基础伤害、一个等级(在多对多关联中定义),并从使用所述武器的角色的关联属性(棍棒的力量、远程武器的敏捷等)获得加值。武器的有效性必须从三个表中得出。关键是字符表的哪一列适用取决于所使用的特定武器 我目前的范例是执行两个select查询,一个是从武器表中检索相关属性(varchar)的名称,然后一个是用先前返回

我正在实现一个支持角色扮演游戏的数据库。有两个相关的表:角色和武器(加上第三个表,表示标准的多对多关系;加上武器的每个特定实例的级别)。角色有多个属性(力量、敏捷、魔法等),每件武器都有一个基础伤害、一个等级(在多对多关联中定义),并从使用所述武器的角色的关联属性(棍棒的力量、远程武器的敏捷等)获得加值。武器的有效性必须从三个表中得出。关键是字符表的哪一列适用取决于所使用的特定武器

我目前的范例是执行两个select查询,一个是从武器表中检索相关属性(varchar)的名称,然后一个是用先前返回的值替换挥舞角色的属性值。我想用一个纯sql解决方案来代替它

我搜索了网络,发现了另外两个问题: 但两者都不是我想要的。我还找到了postgres内部数据类型oid[],能够找到特定列的oid,但找不到使用该oid查询列值的语法

表schemeta:

create table character (
    id int primary key,
    agility int,
    strength int,
    magic int,
    ...);
create table weapon (
    id int primary key,
    damage int,
    associated_attribute varchar(32), --this can be another type if it'd help
    ...);
create table weapon_character_m2m (
    id int primary key,
    weapon int, --foreign key to weapon.id
    character int, --foreign key to character.id
    level int);
在我看来,这应该可以通过这样的方式进行(理想情况下会导致玩家目前拥有的每件武器的有效伤害):

我找到的大多数在线资源最后都建议重新设计数据库。这是一个选项,但我真的不想为武器可能关联的每个属性设置不同的表(实际上有近20个属性可能与武器类关联)


我听说在MSSQL中,通过将外键输入到内部系统表中,这是可能的,但我没有MSSQL的经验,更不用说尝试这样的事情了(我在互联网上找不到工作示例)。如果有人能提供一个工作示例,我会考虑迁移到MSSQL(或任何其他SQL引擎)。

< P>听起来你可以只用这个语句。我知道它在MS SQL中…不确定PostgreSQL


类似于(在我的手机上,因此仅估计代码大小写就可以了,但考虑到将要列出的属性的绝对数量(20+),这将是一个相当麻烦的查询。此外,我希望在将来数据库架构发生更改时(例如,如果添加了属性),不需要修改所有存储的进程。那么,您对更改架构有何看法?我可以为您提供一个解决方案,该解决方案使用中间字符到属性表。您也可以使用一个视图,该视图包含上面的case语句,这些语句可以被存储的进程引用,并且是将来唯一需要更改的地方。我不建议使用foreign内部表的键,因为内部架构可能会被更改、弃用并最终删除。架构更改是可以接受的。听起来像是说一个静态属性表,具有pk id,然后是字符和属性之间的多对多关系,并将外键插入id上的属性中?这将是一个w是的。我不认为这是一种真正直观的方式来考虑数据,因为每个字符通常都具有所有属性,并且每次需要处理字符属性时都会添加一系列额外的连接和检查。另一种方式是使用一个视图,将现有字符表转换为字符属性列表tes没有第二个表,并在武器计算中引用该视图。如果您希望显示如何映射,我可以为前者提供单独的答案。我可以更新此答案以包括案例视图。此外,您是否考虑过多个属性可能影响武器的情况?
select m2m.level as level,
    weapon.associated_attribute as base_attr_name,
    character.??? as base_attr,
    weapon.damage as base_damage,
    base_damage * base_attr * level as effective_attr -- this is the column I care about, others are for clarity via alias
from weapon_character_m2m as m2m
join weapon on weapon.id=m2m.weapon
join character on character.id=m2m.character;
where m2m.character=$d -- stored proc parameter or the like