基于TableB记录设置TableA布尔值

时间:2014-03-05 01:26:26

标签: postgresql

我的数据如下:

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。我知道一些内部查询的非优雅方法,但我想记住更正确的方法来做到这一点。我很肯定我最初是在“更新来自”中完成的。

3 个答案:

答案 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上有索引。