Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 以红移方式批量更新现有行_Sql_Postgresql_Amazon Redshift - Fatal编程技术网

Sql 以红移方式批量更新现有行

Sql 以红移方式批量更新现有行,sql,postgresql,amazon-redshift,Sql,Postgresql,Amazon Redshift,这看起来应该很容易,但事实并非如此。我正在将一个查询从MySQL迁移到表单的红移: INSERT INTO table (...) VALUES (...) ON DUPLICATE KEY UPDATE value = MIN(value, VALUES(value)) 对于我们要插入的主键,这些主键不在表中,它们只是插入的。对于表中已经存在的主键,我们根据一个条件更新行的值,该条件取决于行中的现有值和新值 不起作用,因为我的示例中的filter_表达式取决于表中的当前条目。我目前正在创

这看起来应该很容易,但事实并非如此。我正在将一个查询从MySQL迁移到表单的红移:

INSERT INTO table
(...)
VALUES
(...)
ON DUPLICATE KEY UPDATE
  value = MIN(value, VALUES(value))
对于我们要插入的主键,这些主键不在表中,它们只是插入的。对于表中已经存在的主键,我们根据一个条件更新行的值,该条件取决于行中的现有值和新值


不起作用,因为我的示例中的filter_表达式取决于表中的当前条目。我目前正在创建一个暂存表,在其中插入一个COPY语句,并试图找出合并暂存表和实际表的最佳方法。

我现在必须为一个项目执行此操作。我使用的方法包括3个步骤:

一,

运行更新,以解决我正在更新的已更改字段,无论这些字段是否已更改,但您可以确定:

update table1 set col1=s.col1, col2=s.col2,...
from table1 t
 join stagetable s on s.primkey=t.primkey;
二,

运行针对新记录的插入:

insert into table1
select s.* 
from stagetable s 
 left outer join table1 t on s.primkey=t.primkey
where t.primkey is null;
三,

将源中不再存在的行标记为非活动我们的报告工具使用过滤非活动记录的视图:

update table1 
set is_active_flag='N', last_updated=sysdate
from table1 t
 left outer join stagetable s on s.primkey=t.primkey
where s.primkey is null;

可以创建临时表。在红移中,最好删除并插入记录。 检查一下这个文件


以下是红移的完整工作方法

假设:

A.S3中可用的gunzip格式的数据,带有“|”分隔列,可能有一些垃圾数据,请参阅maxerror

B.带有二维表的销售事实,以保持时间和SKU的简单性。SKU可能有许多组和类别

你们有这样的销售表

CREATE TABLE sales (
 sku_id int encode zstd,
 date_id int encode zstd,
quantity numeric(10,2) encode delta32k,
);
1创建暂存表,该表应类似于应用程序/应用程序使用的在线表

CREATE TABLE stg_sales_onetime (
 sku_number varchar(255) encode zstd,
 time varchar(255) encode zstd,
 qty_str varchar(20) encode zstd,
 quantity numeric(10,2) encode delta32k,
 sku_id int encode zstd,
 date_id int encode zstd
);
2从S3复制数据这可以使用SSH完成

copy stg_sales_onetime (sku_number,time,qty_str) from 
  's3://<buecket_name>/<full_file_path>' CREDENTIALS 'aws_access_key_id=<your_key>;aws_secret_access_key=<your_secret>' delimiter '|' ignoreheader 1 maxerror as 1000 gzip;
4从维度表填充正确的ID

update  stg_sales_onetime set sku_id=<your_sku_demesion_table>.sku_id  from <your_sku_demesion_table> where stg_sales_onetime.sku_number=<your_sku_demesion_table>.sku_number;
update  stg_sales_onetime set time_id=<your_time_demesion_table>.time_id  from <your_time_demesion_table> where stg_sales_onetime.time=<your_time_demesion_table>.time;

请参阅:。是的,这比它应该的难多了。出于某种原因,第三个查询返回“错误:目标表必须是equijoin谓词的一部分”。它以前工作过,但我发现现在可以工作了:update table1 set是\u active\u flag='N',last_updated=sysdate from select t.primkey from table 1 t左外连接stagetable s on s.primkey=t.primkey其中s.primkey为null其中table 1.primkey=a.primkey;更新更改然后插入新行比删除更改的行并插入所有更改的行和新行的性能更好??由于红移中的更新操作在窗帘后面是删除和插入操作。。
update  stg_sales_onetime set sku_id=<your_sku_demesion_table>.sku_id  from <your_sku_demesion_table> where stg_sales_onetime.sku_number=<your_sku_demesion_table>.sku_number;
update  stg_sales_onetime set time_id=<your_time_demesion_table>.time_id  from <your_time_demesion_table> where stg_sales_onetime.time=<your_time_demesion_table>.time;
insert into sales(sku_id,time_id,quantity)  select sku_id,time_id,quantity from stg_sales_onetime;