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 on
和coalesce()
:
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
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
子句是这里的要点,用于从索引中排除许多过时的行。参见:
-
Slow PostgreSQL query in production - help me understand this explain analyze output
我在 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 on
和coalesce()
:
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
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
子句是这里的要点,用于从索引中排除许多过时的行。参见:
Slow PostgreSQL query in production - help me understand this explain analyze output