Sql 使用多个实体规范化CSV数据

Sql 使用多个实体规范化CSV数据,sql,Sql,我正在将CSV导入包含多个实体的数据库:城市,州,和国家 我希望在表中使用外键建立引用的层次结构: City.State\u Ref->State.ID State.Country\u Ref->Country.ID 因此,City表最终将具有以下模式: CREATE TABLE "City" ( "ID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, "Name" INTEGER NOT NULL, "State_Ref"

我正在将CSV导入包含多个实体的数据库:
城市
,和
国家

我希望在表中使用外键建立引用的层次结构:

  • City.State\u Ref
    ->
    State.ID
  • State.Country\u 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")
)
设置
State
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;
但这会导致所有重复的
状态的多个记录

样本数据(问题发生在“仙境”,因为“科罗拉多”存在于多个国家):

如果有任何关于正确设置
状态的指针,我们将不胜感激

多亏了,我才弄明白。。。我没有在第二个
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;
多亏了你,我才明白。。。我没有在第二个
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;

我不认为我会费心规范化数据,除非你有一个特定的原因——在这个数据之外——引用
国家
实体。是的。。。这是一组更大数据的示例。“State”和“Country”等同物都有与之相关的附加数据。我不认为我会费心对数据进行规范化,除非您有一个特定的原因——在这些数据之外——引用
Country
State
实体。是的。。。这是一组更大数据的示例。“州”和“国家”等同物都有与之相关的附加数据。