根据特定条件插入新值

时间:2016-04-12 16:24:04

标签: sql teradata

我正在创建一个新版本的表,添加了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';

我使用与旧列相同的列以及我想要的3个新列创建了新表。此插入是一次性查询,将现有数据转换为我需要的格式。我需要做的是检查ACTV_FLG是否为Y并插入某些值并检查{{1}是ACTV_FLG并插入具有不同值的两行以保留数据的历史记录。在该特定情况下保留原始行,然后制作一个副本,显示其当前的删除状态。

当我尝试UNION时,它出错了。我可以用其他什么方式组合这些选择语句?

1 个答案:

答案 0 :(得分:1)

尝试UNION时遇到的错误可能是3654. Corresponding select-list expressions are incompatible

您尝试混合变量和日期,'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';

但是您可以保留现有的三个Insert并将它们作为Multi-Statement-Request运行,这是Teradata模式会话中的单个事务。在SQL Assistant中,它只是按F9而不是F5(在Teradata Studio中应该类似),在BTEQ中它是基于semicolin的位置(如果新命令在分号后的同一行开始)它是上一个命令的一部分):

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'
;