Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 基于其他两个表的联接的Oracle更新_Sql_Oracle - Fatal编程技术网

Sql 基于其他两个表的联接的Oracle更新

Sql 基于其他两个表的联接的Oracle更新,sql,oracle,Sql,Oracle,我需要更新一个巨大的表,>10亿条记录(POS数据),其中包含一个表中的键,该键基于与第三个表的连接。我可以根据日期对更新进行细分,因为这可以追溯到几年前。 我基本上需要将edw.f_pos_表中的f.retail_sku_键每天替换为dedup.retail_sku_键(如果它们不相同)。 谢谢 选择F.POS\U密钥、F.retail\U sku\U密钥、重复数据消除。retail\U sku\U密钥重复数据消除\U密钥 来自edw.f_pos_daily f、edw.d_retail_sk

我需要更新一个巨大的表,>10亿条记录(POS数据),其中包含一个表中的键,该键基于与第三个表的连接。我可以根据日期对更新进行细分,因为这可以追溯到几年前。 我基本上需要将edw.f_pos_表中的f.retail_sku_键每天替换为dedup.retail_sku_键(如果它们不相同)。 谢谢

选择F.POS\U密钥、F.retail\U sku\U密钥、重复数据消除。retail\U sku\U密钥重复数据消除\U密钥
来自edw.f_pos_daily f、edw.d_retail_sku sku、edw.d_retail_sku_新重复数据消除
其中f.retail_sku_key=sku.retail_sku_key
和sku.retail\u sku=重复数据消除.retail\u sku
和sku.mtd_项目编号=dedup.mtd_项目编号
和sku.retailer=dedup.retailer
和f.retail_sku_key重复数据消除。retail_sku_key

虽然可能存在更新等价物,但当SQL语句驱动需要更新的行并同时生成要更新的值时,我更喜欢使用MERGE

那么,像这样的事情?(我假设f.pos_key是该f_pos_daily表上的唯一标识符。如果情况并非如此,并且查询为同一f_pos_key值返回多行,则此操作将失败。)

如果值介于0和1000之间(以及一些未知的行数),这将为您提供如下输出:

P0  P1  P2  P3  P4  P5  P6  P7  P8  P9  P10
0   104 183 319 402 512 607 723 810 914 1000
从这里开始,您只需要在子查询中包含另一个条件即可

AND f.pos_key BETWEEN 0 AND 104
那么在第一次跑步时

AND f.pos_key BETWEEN 105 AND 183

在第二次运行时,依此类推。

您可以尝试使用批量收集进行所有指定日期的更新。最好更新海量数据你的问题是什么-如何进行相关更新?是一次性更新还是根据日期范围分阶段更新?还有别的吗?如果你有足够的撤销空间,一次更新将是最有效的。Alex,如果可能的话,我想一次完成相关更新。我正在运行Exadata,空间不是问题。
P0  P1  P2  P3  P4  P5  P6  P7  P8  P9  P10
0   104 183 319 402 512 607 723 810 914 1000
AND f.pos_key BETWEEN 0 AND 104
AND f.pos_key BETWEEN 105 AND 183