根据特定条件插入新值
Inserting new values based on certain condition
我正在创建 table 的新版本,其中添加了 3 个新列。这是我的插入查询:
INSERT INTO test_db.new_item
SELECT A.*,'I','2010-02-01','9999-12-31' FROM db.item A WHERE ACTV_FLG = 'Y'
SELECT B.*,'U','2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1) FROM db.item B WHERE ACTV_FLG = 'N'
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),'9999-12-31' FROM db.item C WHERE ACTV_FLG = 'N';
我创建了新的 table,其中包含与旧列相同的列以及我想要的 3 个新列。此插入是一次性查询,用于将现有数据转换为我需要的格式。我需要做的是检查 ACTV_FLG
是否为 Y
并插入某些值并检查是否 ACTV_FLG
是 N
并插入具有不同值的两行以保留数据的历史记录。在那种特定情况下,要保留原始行,然后制作一个副本以显示其当前的删除状态。
当我尝试 UNION 时出错。还有什么其他方法可以组合这些 select 语句?
当您尝试 UNION 时遇到的错误可能是 3654. Corresponding select-list expressions are incompatible
。
您尝试混合使用 Varchars 和 Dates,'2010-02-01'
可能看起来像 DATE 但它是 VARCHAR。请改用日期文字:DATE '2010-02-01'
INSERT INTO test_db.new_item
SELECT A.*,'I',DATE '2010-02-01', DATE '9999-12-31'
FROM db.item A WHERE ACTV_FLG = 'Y'
UNION ALL
SELECT B.*,'U',DATE '2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1)
FROM db.item B WHERE ACTV_FLG = 'N'
UNION ALL
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),DATE '9999-12-31'
FROM db.item C WHERE ACTV_FLG = 'N';
但是您可以保留现有的三个插入,并将它们 运行 作为多语句请求,这是 Teradata 模式会话中的单个事务。在 SQL Assistant 中,它只是按 F9
而不是 F5
(在 Teradata Studio 中应该类似),在 BTEQ 中,它基于分号的位置(如果新命令在同一位置开始分号后的行是前一个命令的一部分):
SELECT A.*,'I',DATE '2010-02-01', DATE '9999-12-31'
FROM db.item A WHERE ACTV_FLG = 'Y'
;INSERT INTO test_db.new_item
SELECT B.*,'U',DATE '2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1)
FROM db.item B WHERE ACTV_FLG = 'N'
;INSERT INTO test_db.new_item
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),DATE '9999-12-31'
FROM db.item C WHERE ACTV_FLG = 'N'
;
我正在创建 table 的新版本,其中添加了 3 个新列。这是我的插入查询:
INSERT INTO test_db.new_item
SELECT A.*,'I','2010-02-01','9999-12-31' FROM db.item A WHERE ACTV_FLG = 'Y'
SELECT B.*,'U','2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1) FROM db.item B WHERE ACTV_FLG = 'N'
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),'9999-12-31' FROM db.item C WHERE ACTV_FLG = 'N';
我创建了新的 table,其中包含与旧列相同的列以及我想要的 3 个新列。此插入是一次性查询,用于将现有数据转换为我需要的格式。我需要做的是检查 ACTV_FLG
是否为 Y
并插入某些值并检查是否 ACTV_FLG
是 N
并插入具有不同值的两行以保留数据的历史记录。在那种特定情况下,要保留原始行,然后制作一个副本以显示其当前的删除状态。
当我尝试 UNION 时出错。还有什么其他方法可以组合这些 select 语句?
当您尝试 UNION 时遇到的错误可能是 3654. Corresponding select-list expressions are incompatible
。
您尝试混合使用 Varchars 和 Dates,'2010-02-01'
可能看起来像 DATE 但它是 VARCHAR。请改用日期文字:DATE '2010-02-01'
INSERT INTO test_db.new_item
SELECT A.*,'I',DATE '2010-02-01', DATE '9999-12-31'
FROM db.item A WHERE ACTV_FLG = 'Y'
UNION ALL
SELECT B.*,'U',DATE '2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1)
FROM db.item B WHERE ACTV_FLG = 'N'
UNION ALL
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),DATE '9999-12-31'
FROM db.item C WHERE ACTV_FLG = 'N';
但是您可以保留现有的三个插入,并将它们 运行 作为多语句请求,这是 Teradata 模式会话中的单个事务。在 SQL Assistant 中,它只是按 F9
而不是 F5
(在 Teradata Studio 中应该类似),在 BTEQ 中,它基于分号的位置(如果新命令在同一位置开始分号后的行是前一个命令的一部分):
SELECT A.*,'I',DATE '2010-02-01', DATE '9999-12-31'
FROM db.item A WHERE ACTV_FLG = 'Y'
;INSERT INTO test_db.new_item
SELECT B.*,'U',DATE '2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1)
FROM db.item B WHERE ACTV_FLG = 'N'
;INSERT INTO test_db.new_item
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),DATE '9999-12-31'
FROM db.item C WHERE ACTV_FLG = 'N'
;