如何在没有任何条件的情况下从另一个表更新一个表中的值?

时间:2017-04-28 11:44:45

标签: sql sqlite

假设我有两个表:

CREATE TABLE  dissemination_areas (
  id INTEGER NOT NULL PRIMARY KEY,
  area_code VARCHAR(50) NOT NULL UNIQUE
  coordinates VARCHAR(1024)
);

CREATE TABLE  census_tract_areas (
  id INTEGER NOT NULL PRIMARY KEY ,
  city_code VARCHAR(50) NOT NULL,
  census_tracts_code VARCHAR(50) NOT NULL,
  coordinates VARCHAR(1024),

  UNIQUE (city_code, census_tracts_code)
);

这些表适用于完全不同的实体,并且两者都被填充,除了coordinates字段仅填充在一个表中。

出于测试目的,我想从第一个表中更新第二个表中的坐标。我不想只使用一个coordinates walue,我想迭代第一个表。

如何在SQL中执行此操作?

请注意,表之间不存在关系。此外,ids并非一致。

订单无关紧要。

3 个答案:

答案 0 :(得分:0)

您可以使用游标从第一个表中获取所有坐标值并迭代它,在每次迭代中,您在第二个表中插入光标中当前迭代的坐标

如果你告诉我们你正在使用什么DBMS,那将会有很大帮助,所以我们可以帮助你如何创建这样的命令

答案 1 :(得分:0)

你可以这样做:

update census_tract_area
set coordinates = (select coordinates from dissemination_areas order by random() limit 1)

这将使用census_tract_area的随机坐标更新dissemination_areas

如果您不喜欢random()的想法,并且dissemination_areascensus_tract_area中的行数至少与with cte as ( select d.coordinates, d.row_number, c.id from (select d1.id, d1.coordinates, (select count(*) from dissemination_areas d2 where d1.id >= d2.id) as row_number from dissemination_areas d1) d join (select c1.id, c1.coordinates, (select count(*) from census_tract_areas c2 where c1.id >= c2.id) as row_number from census_tract_areas c1) c on d.row_number = c.row_number ) update census_tract_areas set coordinates = (select coordinates from cte where census_tract_areas.id = cte.id); 中的行数相同,那么这应该有效:

census_tract_areas

这基本上为每个表分配行号,以便它们具有用于相互连接的公共字段,然后使用行号匹配的dissemination_areas的坐标更新def dashboard(): page_size = 1 files = File.query.order_by(File.title) search = False q = request.args.get('q') if q: search = True page = int(request.args.get('page',1)) pagination = Pagination(page=page, total=files.count(), per_page=page_size, css_framework='bootstrap3', search=search) return render_template('dashboard.html', files=files, pagination=pagination)

答案 2 :(得分:0)

您只需创建在实际ID和连续rowid值之间映射的新表:

CREATE TEMPORARY TABLE d_ids AS SELECT id FROM dissemination_areas;
CREATE TEMPORARY TABLE c_ids AS SELECT id FROM census_tract_areas;
-- use ORDER BY if you care

然后,您可以更新相应的其他行中的每一行:

UPDATE census_tract_areas
SET coordinates = (SELECT coordinates
                   FROM dissemination_areas
                   WHERE id = (SELECT id
                               FROM d_ids
                               WHERE rowid = (SELECT rowid
                                              FROM c_ids
                                              WHERE id = census_tract_areas.id)));