2016-04-12 16 views
0

3 yeni sütun ekleyen bir tablonun yeni bir sürümünü oluşturuyorum. İşte benim insert sorgusu: Belirli koşullara göre yeni değerler ekleme

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

Ben eskisinin aynı sütunlar artı istediğim 3 yeni sütun ile yeni bir tablo oluşturdu. Bu ekleme, varolan verileri, gereksinim duyduğum formata dönüştürmek için bir kerelik bir sorundur. Yapmam gereken şey, ACTV_FLG'un Y olup olmadığını kontrol etmek ve belirli değerleri eklemek ve ACTV_FLG'un N olup olmadığını kontrol etmek ve farklı satırlarla iki satır eklemek Verilerin geçmişini tutmak. Orijinal satırı korumak için bu özel durumda, o zaman mevcut silme durumunu gösteren bir kopyasını yapın.

UNION'u denediğimde hata çıkıyor. Bu seçilmiş ifadeleri başka hangi şekilde birleştirebilirim?

+0

Yeni_item tablosunda olduğundan daha fazla sütun eklediğinizi varsayalım. –

+0

Hayır, new_item tablosu ihtiyacım olan tüm yeni sütunlara sahiptir, ancak bu sütunlar NULL DEĞİLDİR, bu yüzden bunları veriyle doldurmam gerekiyor. – Saliceran

+0

Aldığınız tam hata mesajı nedir? sütun değerleri farklı bir veri tipinde mi? –

cevap

1

UNION denediğinizde karşılaştığınız hata muhtemelen bir 3654. Corresponding select-list expressions are incompatible.

Varchars and Dates'i karıştırmaya çalışıyorsunuz, '2010-02-01' bir DATE'ye benziyor olabilir, ancak bir VARCHAR. yerine değişmez bir tarih kullanın: 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'; 

Ama mevcut üç Ek'lerinizi tutmak ve Teradata modu oturumda tek bir işlem olan bir Multi-Bildirimi-Request, onları çalışabilir. SQL Asistan'da, F5 yerine (Teradata Studio'da benzer olmalıdır) F9'a basarak ve BTEQ'da, bu, noktalı virgülün pozistonuna dayanır (eğer yeni bir komut, noktalı virgülden sonra aynı satırda başlarsa, önceki komutun bir parçası olur):

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

DATE literalini kullanmak hile yaptı. Çok teşekkürler! – Saliceran