我的数据如下:
TableA
- id INT
- is_in_table_b BOOL
TableB
- id INT
- table_a_id INT
在重新组织数据结构的时候,我意外地在dev机器上清除了'is_in_table_b'BOOL,我忘记了我是如何创建它的。它只是一些开发基准测试的捷径。
我尝试的所有“UPATE ... FROM ....”变体都根据连接将所有内容设置为“true”。我不记得我最初是否有过CAST。
有没有人知道一种简单,优雅的方法来实现这一目标?如果TableA.id出现在TableB.table_a_id中,我只想将is_in_table_b
设置为True。我知道一些内部查询的非优雅方法,但我想记住更正确的方法来做到这一点。我很肯定我最初是在“更新来自”中完成的。
答案 0 :(得分:2)
这个应该很简单:
UPDATE tableA SET
is_in_table_b = exists (select 1 FROM tableB WHERE table_a_id=tableA.id);
答案 1 :(得分:1)
是的,在表之间进行更新以进行更新。
设置:
CREATE TABLE table_a (
id int not null auto_increment primary key,
is_in_b boolean
);
CREATE TABLE table_b (
table_a_id int
);
-- create some test data in table_a;
INSERT INTO table_a (is_in_b) VALUES (FALSE), (FALSE), (FALSE);
INSERT INTO table_a (is_in_b) SELECT FALSE
FROM table_a a1
JOIN table_a a2
JOIN table_a a3;
-- and create a subset of matching data in table_a;
INSERT INTO table_b (table_a_id)
SELECT id FROM table_a ORDER BY RAND() limit 5;
现在回答:
UPDATE table_a
JOIN table_b ON table_a_id = table_a.id
SET is_in_b = TRUE;
使用
查看结果SELECT * from table_b;
SELECT * FROM table_a WHERE is_in_b;
适用于http://sqlfiddle.com/#!2/8afc0/1 - 我认为也应该在Postgres工作。
答案 2 :(得分:1)
考虑完全删除该冗余列并使用视图或“生成的列”(使用EXISTS
expression provided by @Daniel)。有关问题的详情如下:
Store common query as column?
确保在TableB.table_a_id
上有索引。