2014-10-06 197 views
1

我在ms-access 2013中發射了一個Update查詢。但是這個更新查詢將針對不同條件下的不同行執行。我知道在Access中我們不能使用「CASE ... WHEN」條件。我們需要去開關() function.Below是我的更新查詢:參數太少。預計2在Talend

UPDATE T_Generated_OpportunityLine SET IsUploadable = Switch(
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c>=5000,"Y", 
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c<5000,"N", 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c>=5000,"Y", 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c<5000,"N", 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c>=30000,"Y", 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c<30000,"N", 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c>=25000,"Y", 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c<25000,"N", 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c>=15000,"Y", 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c<15000,"N"); 

此查詢正確地從接入2013.But當我使用此查詢在Talend5.4在運行「 tAccessRow「元素然後我得到以下錯誤:

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2 

更新之前,我的表列如下:

LowestLevelInPyramid_c Lowestlevelvalue_c   LineStatus_c Quantity_c Amount_c LineClosedate_c IsUploadable 
    ProductLine    PTLRC -Swiss CCO Standards Pending   1   9600  11/21/2013 

更新後,這將是

LowestLevelInPyramid_c Lowestlevelvalue_c   LineStatus_c Quantity_c Amount_c LineClosedate_c IsUploadable 
    ProductLine    PTLRC -Swiss CCO Standards Pending   1   9600  11/21/2013  Y/N 

這個「Y/N」將根據評估條件,如上面提到的查詢所解釋的。這裏的每一行代表opportunityLine.Through更新我正在確定一個特定的行是否可上傳到客戶關係管理系統或不。如果它的'Y',那麼它將可以上傳,如果它的「N」,那麼它將不可上傳。

任何人都可以提供任何合適的解決方案?

+0

不要在tAccessRow中執行此操作。改爲將邏輯放入tMap中。 – ydaetskcoR 2014-10-06 10:11:23

+0

還有據我所知TMAP是通常用於映射purpose.and我想通過這個query.so我怎麼能實現這個使用TMAP更新表的特定列? – 2014-10-06 10:13:54

+0

您的更新聲明看起來不太清楚。您能否在更新之前提供您的數據示例,以及之後應該看起來如何? – ydaetskcoR 2014-10-06 11:04:01

回答

1

通常,這種轉換通常在tMap或tJavaRow組件中完成,而不是試圖在DML語句中嵌套一堆邏輯。這應該使它更適合未來的變化,並且通過這樣簡單的轉換,性能往往非常好,因爲Talend不需要緩衝整個數據集,並且可以從源讀取,轉換和更新流中的目標。

當處理非常大的數據集(通常是100萬行+)時,您可能更喜歡將數據保存在數據庫中,並使用數據庫行組件或者更好的是Talend提供的ELT組件來執行轉換。

一個非常簡單的ETL任務設置看起來是這樣的:

Sample job layout

此作業連接到MySQL數據庫然後再換所有從表中數據導入的模式。

工作的主要部分發生在具有這樣的配置的TMAP:

tMap variable configuration

在上面的截圖中,我已經創建了一個計算的東西是否是上載的,是這樣一個變量它是true。這對於每種類型的LowestLevelValue_c都重複。

然後最後我們使用的值三元運營商IsUploadable

IsUploadable ternary operator

如果有任何變量都是true然後IsUpload被設置爲「Y」,否則它被設置爲「N」 。

我的作業的剩餘部分則採用了tLogRow打印結果到控制檯,但你可以使用一個tAccessOutput組件集來更新您的Access數據庫。確保已配置您的架構有一個唯一的密鑰對(在這種情況下,你很可能LowestLevelValue_cAmount_c如果缺乏對錶的唯一主鍵)更新。

0

正如你猜中,這個問題是與Switch()功能。這是一個VBA函數,而不是原生的Jet/ACE SQL函數。這就是爲什麼它從Access工作並失敗Talend。

爲了使這項工作,你需要你的Switch()聲明轉化爲一個嵌套IIf()IIf()是一個原生的Jet/ACE語句。它會比Switch()函數有點醜,但實際上應該更好,因爲它使用短路布爾邏輯。

+0

我仍然關心把邏輯嵌套IIF()而不是使用了Talend爲此持有邏輯。如果您在傳統RDBMS中討論數百萬條記錄,性能警告將會保留,但這是Access,可能最多爲成千上萬/幾萬行。 – ydaetskcoR 2014-10-07 08:31:59

0

我已經解決了problem.The問題是與「Y/N」。在了Talend我們需要使用「Y」或「N」。我修改查詢的結構是這樣的:

UPDATE T_Generated_OpportunityLine SET IsUploadable = Switch(
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c>=5000,'Y', 
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c<5000,'N', 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c>=5000,'Y', 
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c<5000,'N', 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c>=30000,'Y', 
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c<30000,'N', 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c>=25000,'Y', 
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c<25000,'N', 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c>=15000,'Y', 
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c<15000,'N');