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 会说:
错误:列“行”具有伪类型记录
我怎么能解决这个问题?
distinct
是不是一个函数。它始终对结果的所有列进行操作。
之间的差select distinct (foo), bar
和select distinct foo, bar
是相同的之间的差select (foo), bar
和select 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
可能比使用窗口函数的解决方案更快。
归档时间: |
|
查看次数: |
18746 次 |
最近记录: |