如何在 teradata 中迁移 sql 更新查询?
how to migrate sql update query in teradata?
我想在 teradata 中迁移以下查询。我正在更新 table 中的一些行,并在 sql 中编写了此查询。现在,我想在 teradata 中迁移下面的脚本。听说要用volatiletable把数据select再update。是否必须先创建一个 volatile table 然后更新?
UPDATE gam
SET gam.DeviceActiveInSIGMA = 1,
gam.DeviceInSIGMA =1,
gam.AccountServiceInSIGMA =1,
gam.AccountInSIGMA =1,
gam.PKG_TYPE = 'VOICE',
gam.MACType = 'Voice'
FROM Staging.AllAccountDevices gam
WITH (INDEX (ix_MAC_UniqueID))
INNER JOIN dbo.TBL_SIGMA_VOIP_EQUIPMENT dvc
ON gam.MACAddr = dvc.MTA_MAC
INNER JOIN dbo.TBL_SIGMA_SUB sac
ON dvc.SUB_ID = sac.SUB_ID
AND gam.AccountNumber = sac.Account_Number
LEFT OUTER JOIN HSIRECON.DBO.NEXTGEN_ACTIVE_SPAS nas
ON SUBSTRING(gam.AccountNumber,1,6) = nas.ACCOUNT_START
WHERE nas.ACCOUNT_START is NULL
AND gam.DeviceActiveInSIGMA = 0
AND dvc.STATUS IN ('active','change_in_progress')
您不需要使用 Volatile Table,而是派生的 Table,因为 Teradata 不支持更新中的外部连接。
与此类似:
UPDATE gam
FROM Staging.AllAccountDevices AS gam,
(
SELECT * FROM Staging.AllAccountDevices gam
INNER JOIN dbo.TBL_SIGMA_VOIP_EQUIPMENT dvc
ON gam.MACAddr = dvc.MTA_MAC
INNER JOIN dbo.TBL_SIGMA_SUB sac
ON dvc.SUB_ID = sac.SUB_ID
AND gam.AccountNumber = sac.Account_Number
LEFT OUTER JOIN HSIRECON.DBO.NEXTGEN_ACTIVE_SPAS nas
ON Substr(gam.AccountNumber,1,6) = nas.ACCOUNT_START
WHERE nas.ACCOUNT_START IS NULL
AND gam.DeviceActiveInSIGMA = 0
AND dvc.STATUS IN ('active','change_in_progress')
) AS dt
SET DeviceActiveInSIGMA = 1,
DeviceInSIGMA =1,
AccountServiceInSIGMA =1,
AccountInSIGMA =1,
PKG_TYPE = 'VOICE',
MACType = 'Voice'
WHERE gam.pk = dt.pk -- must be the Primary Key columns(s) of Staging.AllAccountDevices
AND gam.DeviceActiveInSIGMA = 0
顺便说一句,原始查询是为 SQL 服务器而不是 Oracle 编写的。
我想在 teradata 中迁移以下查询。我正在更新 table 中的一些行,并在 sql 中编写了此查询。现在,我想在 teradata 中迁移下面的脚本。听说要用volatiletable把数据select再update。是否必须先创建一个 volatile table 然后更新?
UPDATE gam
SET gam.DeviceActiveInSIGMA = 1,
gam.DeviceInSIGMA =1,
gam.AccountServiceInSIGMA =1,
gam.AccountInSIGMA =1,
gam.PKG_TYPE = 'VOICE',
gam.MACType = 'Voice'
FROM Staging.AllAccountDevices gam
WITH (INDEX (ix_MAC_UniqueID))
INNER JOIN dbo.TBL_SIGMA_VOIP_EQUIPMENT dvc
ON gam.MACAddr = dvc.MTA_MAC
INNER JOIN dbo.TBL_SIGMA_SUB sac
ON dvc.SUB_ID = sac.SUB_ID
AND gam.AccountNumber = sac.Account_Number
LEFT OUTER JOIN HSIRECON.DBO.NEXTGEN_ACTIVE_SPAS nas
ON SUBSTRING(gam.AccountNumber,1,6) = nas.ACCOUNT_START
WHERE nas.ACCOUNT_START is NULL
AND gam.DeviceActiveInSIGMA = 0
AND dvc.STATUS IN ('active','change_in_progress')
您不需要使用 Volatile Table,而是派生的 Table,因为 Teradata 不支持更新中的外部连接。
与此类似:
UPDATE gam
FROM Staging.AllAccountDevices AS gam,
(
SELECT * FROM Staging.AllAccountDevices gam
INNER JOIN dbo.TBL_SIGMA_VOIP_EQUIPMENT dvc
ON gam.MACAddr = dvc.MTA_MAC
INNER JOIN dbo.TBL_SIGMA_SUB sac
ON dvc.SUB_ID = sac.SUB_ID
AND gam.AccountNumber = sac.Account_Number
LEFT OUTER JOIN HSIRECON.DBO.NEXTGEN_ACTIVE_SPAS nas
ON Substr(gam.AccountNumber,1,6) = nas.ACCOUNT_START
WHERE nas.ACCOUNT_START IS NULL
AND gam.DeviceActiveInSIGMA = 0
AND dvc.STATUS IN ('active','change_in_progress')
) AS dt
SET DeviceActiveInSIGMA = 1,
DeviceInSIGMA =1,
AccountServiceInSIGMA =1,
AccountInSIGMA =1,
PKG_TYPE = 'VOICE',
MACType = 'Voice'
WHERE gam.pk = dt.pk -- must be the Primary Key columns(s) of Staging.AllAccountDevices
AND gam.DeviceActiveInSIGMA = 0
顺便说一句,原始查询是为 SQL 服务器而不是 Oracle 编写的。