Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 更新在Netezza中无法正常工作。这实际上是一个一般性的话题_Sql_Sql Update_Netezza - Fatal编程技术网

Sql 更新在Netezza中无法正常工作。这实际上是一个一般性的话题

Sql 更新在Netezza中无法正常工作。这实际上是一个一般性的话题,sql,sql-update,netezza,Sql,Sql Update,Netezza,我不知道为什么更新查询不能正常运行,或者我遗漏了一些非常琐碎的东西? 下面是我正在运行的一系列非常简单的步骤 步骤1:创建表格 CREATE table SNAPDATE_YOS as SELECT SNAPSHOTDATE, PREFERENCE_ID, CVALIDEMAIL, (CVALIDEMAIL * 1.0125) AS new_CVALIDEMAIL FROM RPT_EMAIL_CATEGORY_PREFERENCE WHERE SNAPSHOTDATE = '2014-07-

我不知道为什么更新查询不能正常运行,或者我遗漏了一些非常琐碎的东西? 下面是我正在运行的一系列非常简单的步骤

步骤1:创建表格

CREATE table SNAPDATE_YOS as SELECT SNAPSHOTDATE, PREFERENCE_ID, CVALIDEMAIL, (CVALIDEMAIL * 1.0125) AS new_CVALIDEMAIL
FROM RPT_EMAIL_CATEGORY_PREFERENCE 
WHERE SNAPSHOTDATE = '2014-07-07 00:00:00'
AND PREFERENCE_ID = 'Yosemite';
1行受影响

Select * from SNAPDATE_YOS;
快照日期| | |首选项| | | | | | |新| CVALIDEMAIL

2014-07-07 00:00:00 |约塞米蒂| 97676 | 98896.9500

步骤2:使用步骤1中创建的表更新联接条件的表RPT\u EMAIL\u CATEGORY\u首选项。

UPDATE RPT_EMAIL_CATEGORY_PREFERENCE
SET CVALIDEMAIL = ROUND(S.new_CVALIDEMAIL,0)
FROM SNAPDATE_YOS S
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
Select ROUND(S.new_CVALIDEMAIL,0) as CVALIDEMAIL
FROM SNAPDATE_YOS S   
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
Select * from RPT_EMAIL_CATEGORY_PREFERENCE;
更新了34行

在我看来,只有一行应该更新,因为连接条件只给了我一行

以下是支持它的声明

支持语句1:根据条件选择行。

UPDATE RPT_EMAIL_CATEGORY_PREFERENCE
SET CVALIDEMAIL = ROUND(S.new_CVALIDEMAIL,0)
FROM SNAPDATE_YOS S
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
Select ROUND(S.new_CVALIDEMAIL,0) as CVALIDEMAIL
FROM SNAPDATE_YOS S   
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
Select * from RPT_EMAIL_CATEGORY_PREFERENCE;
输出:

CVALIDEMAIL

98897

支持声明2:选择所有列

Select *
FROM SNAPDATE_YOS S   
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
选择1行

支持语句3:从需要更新的表中选择数据。

UPDATE RPT_EMAIL_CATEGORY_PREFERENCE
SET CVALIDEMAIL = ROUND(S.new_CVALIDEMAIL,0)
FROM SNAPDATE_YOS S
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
Select ROUND(S.new_CVALIDEMAIL,0) as CVALIDEMAIL
FROM SNAPDATE_YOS S   
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
Select * from RPT_EMAIL_CATEGORY_PREFERENCE;
选择34行

在我看来,RPT_EMAIL_CATEGORY_首选项表中只应更新1行,该表满足更新条件。我是不是遗漏了一些非常琐碎的东西

查询计划:

查询PlantText:

嵌套循环(成本=1.6..1.7行=34宽度=113形态=51)

l:顺序扫描表“RPT_电子邮件_类别_首选项”(成本=0.0..0.0行=34宽度=105配置=100)

r:Materialize(成本=0.0..0.0行=1宽度=16形态=0)

新西兰版本

[nz@usga-qts-tfam-01~]$nzrev

7.1.0.2-P2版[构建39804]

提前谢谢。
Vivek

这里的问题是,您将两次加入RPT\u电子邮件\u类别\u首选项。您可能没有意识到这一点,因为与指定要更新的表的联接是隐式的

UPDATE RPT_EMAIL_CATEGORY_PREFERENCE  
--  ^ First reference to RPT_EMAIL_CATEGORY_PREFERENCE (with no alias)
SET CVALIDEMAIL = ROUND(S.new_CVALIDEMAIL,0)
FROM SNAPDATE_YOS S 
-- Which is then joined to SNAPDATE S with NO join criteria, making it a cross join producing
-- 1 x 34 rows
JOIN RPT_EMAIL_CATEGORY_PREFERENCE P ON P.PREFERENCE_ID = S.PREFERENCE_ID 
-- The third join then joins 1 row from RPT_EMAIL_CATEGORY_PREFERENCE with no join criteria
-- other than a WHERE clause which makes the output to 1 x 34 x 1 rows.
-- This is because the RPT_EMAIL_CATEGORY_PREFERENCE when referenced with a different alias
-- is treated as a separate table.
WHERE P.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND P.PREFERENCE_ID = 'Yosemite';
我认为您需要的更新是:

UPDATE RPT_EMAIL_CATEGORY_PREFERENCE 
SET CVALIDEMAIL = ROUND(SNAPDATE_YOS.new_CVALIDEMAIL,0)
FROM SNAPDATE_YOS
WHERE 
RPT_EMAIL_CATEGORY_PREFERENCE.PREFERENCE_ID = SNAPDATE_YOS.PREFERENCE_ID 
AND RPT_EMAIL_CATEGORY_PREFERENCE.SNAPSHOTDATE = '2014-11-21 00:00:00'
AND PRPT_EMAIL_CATEGORY_PREFERENCE.PREFERENCE_ID = 'Yosemite';

为了清晰起见,我删除了别名(对于这种情况是否有用,意见可能会有所不同)。您应该只引用正在更新的表一次。对于Netezza,更新中的内部联接由FROM和WHERE子句隐式指定。

是的,这正是我后来注意到的。谢谢。