select 如何从 sql 中的两列获取数据?

How select data from two column in sql?

我在 postgresql 中有一个 table 如下:

id |   name   | parent_id |
1  | morteza  |   null    |
2  |   ali    |   null    |
3  | morteza2 |     1     |
4  | morteza3 |     1     |

我的唯一数据是 id=1,2 的记录,并且记录 id=1 修改了两次。现在我想要 select 上次修改的数据。以上数据查询结果如下:

id |   name   |
1  | morteza3 |
2  |   ali    |

什么是 suitable 查询?

如果我没看错,你可以使用distinct oncoalesce():

select distinct on (coalesce(parent_id, id)) coalesce(parent_id, id) as new_id, name
from mytable
order by coalesce(parent_id, id), id desc

Demo on DB Fiddle:

new_id | name    
-----: | :-------
     1 | morteza3
     2 | ali     

根据您的描述,每一行的最新版本似乎有 parent_id IS NULL。 (并且过时的行版本有 parent_id IS NOT NULL。)

那么查询就简单了:

SELECT id, name
FROM   tbl
WHERE  parent_id IS NULL;

db<>fiddle here

如果您有很多更新(因此,有很多过时的行版本),部分索引将对性能有很大帮助:

CREATE INDEX ON tbl(id) WHERE parent_id IS NULL;

实际的索引列大多是无关紧要的(除非有额外的要求)。 WHERE 子句是这里的要点,用于从索引中排除许多过时的行。参见: