【问题标题】:How to populate a table with an id attribute that is predefined as a foreign key in another table如何使用在另一个表中预定义为外键的 id 属性填充表
【发布时间】:2021-04-08 10:02:59
【问题描述】:

我的数据库中有三个表:

  1. 具有属性(skillid、属性 1、属性 2、属性 3)的 HASSKILLS - skillid 是 SKILLS 的主键和外键
  2. OLDHASSKILLS 具​​有属性(描述,属性 1,属性 2,属性 3) - 描述 是主键
  3. 具有属性的技能 (skillid, description) - skillid 是主键

SKILLS 中的每个 skillid 对单个描述都是唯一的(例如“3”、“可以爬树”)

我创建了 HASSKILLS 表,它最终将替换我的 OLDHASSKILLS,因为我想引用并使用 skillid 来引用 SKILLS,而不是描述。

OLDHASSKILLS 和 SKILLS 都填充了数据,我的 HASSKILLS 也填充了,除了 skillid

我想用新的 HASSKILLS 表中的相应 skillid 值有效地替换所有 description 值。

我已经尝试通过使用 INSERT INTO 语句和嵌套查询来做到这一点。

INSERT INTO HASSKILLS(SkillId) 
    SELECT SkillId 
    FROM SKILLS 
    WHERE 
        (SELECT d1.description, d2.description 
         FROM OLDHASSKILLS d1, SKILLS d2 
         WHERE d1.description = d2.description);

我的“WHERE (SELECT”) 有问题,错误子查询必须只返回一列。

我的 SQL 语句是否出错,或者有更好的方法吗?

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(差不多 30 年前),不鼓励使用它
  • 有道理,谢谢

标签: sql postgresql join nested sql-insert


【解决方案1】:

加入FROM 子句,而不是完全不连接的子查询。

INSERT INTO hasskills
            (skillid,
             attribute1,
             attribute2,
             attribute3) 
            SELECT s.skillid,
                   ohs.attribute1,
                   ohs.attribute2,
                   ohs.attribute3
                   FROM oldhasskills ohs
                        INNER JOIN skills s
                                   ON ohs.description = s.description;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多