繁体   English   中英

如何将2列合并为一个并使用合并的列保存多个值

[英]How to combine 2 columns into one and use that merged column to hold multiple values

我有一张有栏的桌子

id, playername, sport1, sport2

但是,我的要求是,一个玩家可以进行n项运动,因此需要多值列“ sports”,否则我将选择sport3,sport4等。 如何更改表格以组合sport1,sport2,并将其用作将来新行的多值列?

经典的解决方案是使用第二个表,其中包含用于playerId和运动的列。 然后,要查看玩家拥有的所有运动,请将两者结合起来。

sqlite不支持多值字段。 我知道可以做到这一点的唯一DBMS是Microsoft Access,但是即使保证您只能在Windows计算机上运行,​​我通常也不建议从sqlite切换到Access。

这是数据库设计的经典问题。 我建议您从一个表切换到多个表,以便在数据库中准确地描绘每种实体类型。 例如,一项运动的名称不是运动员的属性,而是一项运动的属性,因此您可能需要一个运动表。 您显然需要一个Player表。 而且由于玩家可以进行多种运动,并且每种运动可能由多个玩家进行,所以您具有多对多的关系 可以在RDBMS中使用带有外键的多个表对其进行建模。

考虑以下数据库结构(尽管它可能按原样工作,但可以将其视为伪代码)。

CREATE TABLE Player (
    PlayerId int NOT NULL PRIMARY KEY,
    Name string NOT NULL UNIQUE
)

CREATE TABLE Sport (
    SportId int NOT NULL PRIMAEY KEY,
    Name string NOT NULL UNIQUE
)

CREATE TABLE PlayerSport (
    PlayerId int NOT NULL FOREIGN KEY REFERENCES Player (PlayerId),
    SportId int NOT NULL FOREIGN KEY REFERENCES Sport (SportId),
    PRIMARY KEY (
        PlayerId,
        SportId
    )
)

这种结构是通过数据库规范化过程实现的。

现在,您可以获得运动员的所有运动清单,

SELECT
    Sport.Name
FROM Sport
    INNER JOIN PlayerSport ON PlayerSport.SportId = Sport.SportId
        AND PlayerSport.PlayerId = @PlayerId
ORDER BY
    Sport.Name

或所有参加一项运动的选手,

SELECT
    Player.Name
FROM Player
    INNER JOIN PlayerSport ON PlayerSport.SportId = Player.PlayerId
        AND PlayerSport.SportId = @SportId
ORDER BY
    Player.Name

或所有球员和运动,

SELECT
    Player.Name AS Player,
    Sport.Name AS Sport
FROM Player
    INNER JOIN PlayerSport ON PlayerSport.SportId = Player.PlayerId
    INNER JOIN Sport ON Sport.SportId = PlayerSport.SportId
ORDER BY
    Player.Name,
    Sport.Name

但是请注意,此最终查询的结构与原始表不同。 在静态SQL中无法为每个玩家输出一行,而为一项运动输出一列。 您可以构造一个动态查询,但这并不容易,容易出错,并且容易受到sql注入安全漏洞的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM