Sql 更新在Netezza中无法正常工作。这实际上是一个一般性的话题
我不知道为什么更新查询不能正常运行,或者我遗漏了一些非常琐碎的东西? 下面是我正在运行的一系列非常简单的步骤 步骤1:创建表格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-
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子句隐式指定。是的,这正是我后来注意到的。谢谢。