我正在创建一个新版本的表,添加了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时,它出错了。我可以用其他什么方式组合这些选择语句?
答案 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'
;