假设我有两个表:
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
并非一致。
订单无关紧要。
答案 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_areas
中census_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)));