2014-10-06 64 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'); 
相关问题