【问题标题】:How select data from two column in sql?如何从sql中的两列中选择数据?
【发布时间】:2020-10-13 09:28:51
【问题描述】:

我在 postgresql 中有一个如下表:

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

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

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

什么是合适的查询?

【问题讨论】:

  • 你认为这是最新的记录

标签: sql postgresql sql-order-by greatest-n-per-group


【解决方案1】:

如果我没听错,你可以使用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 |姓名 -----: | :-------- 1 |莫特萨3 2 |阿里

【讨论】:

    【解决方案2】:

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

    那么查询就很简单了:

    SELECT id, name
    FROM   tbl
    WHERE  parent_id IS NULL;
    

    db小提琴here

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多