0

我遇到了作业问题。任务是:

以下是此作业所需的表结构:

DROP TABLE unesco_raw;
CREATE TABLE unesco_raw
 (name TEXT, description TEXT, justification TEXT, year INTEGER,
    longitude FLOAT, latitude FLOAT, area_hectares FLOAT,
    category TEXT, category_id INTEGER, state TEXT, state_id INTEGER,
    region TEXT, region_id INTEGER, iso TEXT, iso_id INTEGER);

CREATE TABLE category (
  id SERIAL,
  name VARCHAR(128) UNIQUE,
  PRIMARY KEY(id)
);

... 需要更多表格

要为此分配加载 CSV 数据,请使用以下复制命令。添加 HEADER 会导致 CSV 加载程序跳过 CSV 文件中的第一行。\copy 命令必须是一长行。\copy unesco_raw(name,description,justification,year,longitude,latitude,area_hectares,category,state,region,iso) FROM 'whc-sites-2018-small.csv' WITH DELIMITER ',' CSV HEADER; 通过将条目添加到每个查找表(类别等),然后将外键列添加到 unesco_raw 表来规范化 unesco_raw 表中的数据。然后创建一个名为 Unesco 的新表,删除所有未规范化的冗余文本列,如类别。如果您在测试中多次运行该程序或使用不同的文件,请确保在每次运行前清空数据。

自动分级机将查看 UNESCO 表。

为了给这个作业评分,程序会在你的数据库上运行一个这样的查询,并寻找它期望看到的数据:

SELECT unesco.name, year, category.name, state.name, region.name, iso.name
  FROM unesco
  JOIN category ON unesco.category_id = category.id
  JOIN iso ON unesco.iso_id = iso.id
  JOIN state ON unesco.state_id = state.id
  JOIN region ON unesco.region_id = region.id
  ORDER BY year, unesco.name
  LIMIT 3;

我的结果是

期望是

autograder 提供的错误是:Row 1 column 1 expected Aachen Cathedral , got Aachen Cathedral

我所做的代码是创建表:教科文组织、iso、年份、类别、州和地区。此外,使用其他表中的外键将值插入到 UNESCO 表的末尾。

例子:

Insert into unesco (name,iso_id,region_id,state_id,category_id,year) values ('Aachen Cathedral',1,3,1,1,1978);

insert into unesco (name,iso_id,region_id,state_id,category_id,year) values ('City of Quito',2,1,2,1,1978);

insert into unesco (name,iso_id,region_id,state_id,category_id,year) values ('Gal pagos Islands',3,2,3,2,1978);

表格是: 区域表 状态表 年表 类别表 等值表

你能帮忙吗?

我正在使用 PostgreSQL。

4

1 回答 1

1

一步一步做这个

DROP TABLE unesco_raw;
CREATE TABLE unesco_raw (
  name TEXT,
  description TEXT,
  justification TEXT,
  year INTEGER,
  longitude FLOAT,
  latitude FLOAT,
  area_hectares FLOAT,
  category TEXT,
  category_id INTEGER,
  state TEXT,
  state_id INTEGER,
  region TEXT,
  region_id INTEGER,
  iso TEXT,
  iso_id INTEGER
);
CREATE TABLE category (
  id SERIAL,
  name VARCHAR(128) UNIQUE,
  PRIMARY KEY(id)
);
CREATE TABLE state (
  id SERIAL,
  name VARCHAR(128) UNIQUE,
  PRIMARY KEY(id)
);
CREATE TABLE region (
  id SERIAL,
  name VARCHAR(128) UNIQUE,
  PRIMARY KEY(id)
);
CREATE TABLE iso (
  id SERIAL,
  name VARCHAR(128) UNIQUE,
  PRIMARY KEY(id)
);
\ copy unesco_raw(
  name,
  description,
  justification,
  year,
  longitude,
  latitude,
  area_hectares,
  category,
  state,
  region,
  iso
)FROM'whc-sites-2018-small.csv' WITH DELIMITER ',' CSV HEADER;
   
INSERT INTO category(name) SELECT DISTINCT category FROM 
unesco_raw;
INSERT INTO state(name) SELECT DISTINCT state FROM unesco_raw;
INSERT INTO region(name) SELECT DISTINCT region FROM 
 unesco_raw;
INSERT INTO iso(name) SELECT DISTINCT iso FROM unesco_raw;

UPDATE unesco_raw SET category_id = (
  SELECT category.id FROM category WHERE category.name = unesco_raw.category);
UPDATE unesco_raw SET state_id = ( 
  SELECT state.id FROM state WHERE state.name = unesco_raw.state );
UPDATE unesco_raw SET region_id = (
    SELECT region.id FROM region WHERE region.name = unesco_raw.region);
UPDATE unesco_raw SET iso_id = (
    SELECT iso.id FROM iso WHERE iso.name = unesco_raw.iso);

CREATE TABLE unesco (
    name TEXT,
    description TEXT,
    justification TEXT,
    year INTEGER,
    longitude FLOAT,
    latitude FLOAT,
    area_hectares FLOAT,
    category_id INTEGER,
    state_id INTEGER,
    region_id INTEGER,
    iso_id INTEGER
);
INSERT INTO
  unesco(
    name,
    description,
    justification,
    year,
    longitude,
    latitude,
    area_hectares,
    category_id,
    state_id,
    region_id,
    iso_id
  ) select
  name,
  description,
  justification,
  year,
  longitude,
  latitude,
  area_hectares,
  category_id,
  state_id,
  region_id,
  iso_id from unesco_raw;

SELECT unesco.name, year, category.name, state.name, region.name, iso.name
  FROM unesco
  JOIN category ON unesco.category_id = category.id
  JOIN iso ON unesco.iso_id = iso.id
  JOIN state ON unesco.state_id = state.id
  JOIN region ON unesco.region_id = region.id
  ORDER BY state.name, unesco.name
  LIMIT 3;
于 2021-06-23T06:08:39.470 回答