如何从具有多行 DISTINCT 约束的 SELECT 创建 Sql 表?

Dav*_*.it 1 postgresql prepared-statement select

我想从基于多行 DISTINCT 的 SELECT 语句创建一个表,但 PostgreSQL 不允许我这样做。

我需要创建一个表格,其中的元素之前是从另一个表格中选择的,并且它们都是唯一的。

这是我的尝试:

CREATE TABLE new_name AS (

   SELECT DISTINCT(table.field1, table.field2), table.field1, table.field2, 
   FROM ...
   WHERE ...

);
Run Code Online (Sandbox Code Playgroud)

如果我运行这个语句,PostgreSQL 会说:

错误:列“行”具有伪类型记录

我怎么能解决这个问题?

a_h*_*ame 8

distinct不是一个函数。它始终对结果的所有列进行操作。

之间的差select distinct (foo), barselect distinct foo, bar是相同的之间的差select (foo), barselect foo, bar。括号只是“噪音”。

当您编写时,select (foo,bar)您实际上是在 Postgres 中创建一个匿名记录类型,这会导致一个具有两个属性的列 - 这不是您真正想要的。


当您使用 Postgres 时,您可以使用(专有)运算符DISTINCT ON- 与标准相反DISTINCT-确实对列的子集进行操作。

在这种情况下,您必须指定一个 ORDER BY 来定义如果有多个具有相同组合的(field1, field2).

CREATE TABLE new_name 
AS 
SELECT DISTINCT ON (table.field1, table.field2), 
       table.field1, 
       table.field2, 
       .....
FROM ...
WHERE ...
ORDER BY ..
Run Code Online (Sandbox Code Playgroud)

如果你想坚持使用 ANSI SQL,你需要一个窗口函数:

create table new_name
as
select column1, column2, column3, column4, column5, column6
from (
   select column1, column2, column3, column4, column5, column6, 
          row_number() over (partition by column1, column2 order by ...) as rn 
   from the_table
   where ...
) t
where rn = 1;
Run Code Online (Sandbox Code Playgroud)

对于大表,DISTINCT ON可能比使用窗口函数的解决方案更快。