【问题标题】:Normalizing CSV data with multiple entities [duplicate]使用多个实体规范化 CSV 数据 [重复]
【发布时间】:2020-06-20 04:55:56
【问题描述】:

我正在将 CSV 导入包含多个实体的数据库中:CityStateCountry

我想在表中使用外键来建立引用层次结构:

  • City.State_Ref -> State.ID
  • State.Country_Ref -> Country.ID

所以City 表最终将具有以下架构:

CREATE TABLE "City" (
  "ID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
  "Name" INTEGER NOT NULL,
  "State_Ref" INTEGER,
  FOREIGN KEY("State_Ref") REFERENCES "State"("ID")
)

设置StateCountry 表很容易,但是当不同的Country 记录中出现相同的State 名称时,我无法选择正确的名称:

UPDATE City SET State_Ref = (SELECT ID from State WHERE City.State = State.Name);

这将匹配多条记录,LIMIT 只抓取第一条记录(这并不总是正确的)。

我也尝试过JOIN 创建一个具有正确引用的新表:

SELECT City.Name as Name, State.ID as State_Ref

FROM City
    INNER JOIN State ON City.State = State.Name
    INNER JOIN Country ON City.Country = Country.Name

ORDER BY City.Name ASC;

但这会导致所有 State 重复项都有多个记录。

示例数据(“仙境”出现问题,因为“科罗拉多”存在于多个国家/地区):

Country         State         Name
United States   New York      Kingston  
United States   Texas         Paris 
England         Kent          Kingston  
United States   Maine         Paris 
France          Île-de-France Paris 
United States   Colorado      Denver    
Canada          Colorado      Wonderland

任何正确设置State_Ref的指针将不胜感激!

【问题讨论】:

  • 我认为我不会费心对数据进行规范化,除非您有特定原因(在此数据之外)引用 countrystate 实体。
  • 是的...这是一个更大数据集的样本。 “州”和“国家”等价物各有相关的附加数据。

标签: sql


【解决方案1】:

感谢this answer,我能够弄清楚...我没有在第二个JOIN 中过滤匹配的Country

SELECT
    City.Name as Name, State.ID as State_Ref

FROM City
    INNER JOIN State ON City.State = State.Name
    INNER JOIN Country ON (State.Country_Ref = Country.ID AND City.Country = Country.Name)

ORDER BY City.Name ASC;

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2016-05-01
    • 2015-09-04
    • 2012-12-24
    相关资源
    最近更新 更多