Sql 使用多个实体规范化CSV数据
我正在将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"
城市
,州
,和国家
我希望在表中使用外键建立引用的层次结构:
->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
实体。是的。。。这是一组更大数据的示例。“州”和“国家”等同物都有与之相关的附加数据。