2014-10-06 4 views
1

나는 ms 액세스 2013에서 업데이트 쿼리를 실행하고 있습니다. 그러나이 업데이트 쿼리는 다른 조건에서 다른 행에 대해 실행됩니다. Access에서 우리는 "CASE ... WHEN"조건을 사용할 수 없음을 알고 있습니다. 액세스시 우리가 스위치 갈 필요() function.Below 내 업데이트 쿼리입니다 :이 쿼리 "는에 Talend5.4에 액세스 내가이 쿼리를 사용하고 2013.But에서 제대로 실행매개 변수가 너무 적습니다. 예상 Talend에서 2

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"); 

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을 나타냅니다. 업데이트를 통해 특정 행을 업로드 할 수 있는지 여부를 결정합니다. 고객 CRM 시스템 또는 아닙니다. 'Y'이면 업로드 가능한 "N"이면 업로드 할 수 있습니다.

누구나 적절한 솔루션을 제공 할 수 있습니까 ??

+0

tAccessRow에서이 작업을 수행하지 마십시오. 논리를 대신 tMap에 넣으십시오. – ydaetskcoR

+0

글쎄 최대한 tMap은 일반적으로 목적을 매핑하는 데 사용됩니다. 나는이 쿼리를 통해 테이블의 특정 컬럼을 업데이트하려고합니다. 어떻게 tMap을 사용하여 구현할 수 있습니까? –

+0

업데이트 진술이 나에게 불분명 해 보입니다. 업데이트하기 전에 데이터의 예를 제공하고 이후에 어떻게 표시해야합니까? – ydaetskcoR

답변

1

일반적으로 이러한 종류의 변환은 일반적으로 DML 문 내부에 여러 로직을 중첩하지 않고 tMap 또는 tJavaRow 구성 요소에서 수행됩니다. 이렇게하면 향후 변경에 더욱 적합하게 될 것이며 Talend는 전체 데이터 세트를 버퍼링 할 필요가 없으며 소스에서 읽을 수 있고 플로우의 대상을 변환 및 업데이트 할 수 있으므로 이와 같은 간단한 변환으로 성능이 매우 좋아집니다.

대용량 데이터 세트 (일반적으로 1 백만 행 +)를 처리 할 때 데이터베이스 내부에 데이터를 보관하고 데이터베이스 행 구성 요소 또는 Talend가 제공하는 ELT 구성 요소를 사용하여 변환을 수행하는 것이 좋습니다.

아주 간단한 ETL 작업 설정은 같은 보일 수 있습니다 :이 작업은 MySQL 데이터베이스에 연결

Sample job layout

을 다음 스키마로 테이블에서 모든 데이터를 가져옵니다. , 뭔가가 업로드 가능한인지를 계산하고 그렇게하는 변수를 만든 위의 스크린 샷에서

tMap variable configuration

:

작업의 주요 부분은이 같은 구성을 갖는 TMAP에서 발생 true입니다. 이것은 LowestLevelValue_c의 모든 유형에 대해 반복됩니다.다음

하고 마침내는 IsUploadable 대한 값 삼원 연산자를 사용

IsUploadable ternary operator

변수 중 true 다음 IsUpload이 "Y"로 설정되어있는 경우, 그렇지 않으면이 "N"으로 설정있어 .

내 작업의 나머지 부분은 tLogRow를 사용하여 콘솔에 결과를 인쇄하지만 Access 데이터베이스를 업데이트하기 위해 설정된 tAccessOutput 구성 요소를 사용할 수 있습니다. 업데이트 할 고유 키를 갖도록 스키마를 구성했는지 확인하십시오.이 경우 고유 한 기본 키가없는 경우 LowestLevelValue_cAmount_c을 사용할 수 있습니다.

0

올바르게 추측 한대로 Switch() 함수에 문제가 있습니다. 이것은 VBA 함수이며 원시 Jet/ACE SQL 함수는 아닙니다. 그것이 Access에서 작동하고 Talend에서 실패한 이유입니다.

이 작업을 수행하려면 Switch() 문을 중첩 된 IIf()으로 변환해야합니다. IIf()은 기본 Jet/ACE 문입니다. 그것은 Switch() 함수보다 약간 추악 할 것입니다. 그러나 단락 부울 논리를 사용하기 때문에 실제로 더 잘 수행되어야합니다.

+0

Talend를 사용하는 대신 중첩 된 IIF()에 논리를 적용하는 것에 대해 여전히 염려합니다. 이를위한 논리를 유지해야합니다. 전통적인 RDBMS에서 수백만 건의 레코드에 대해 이야기하고 있었다면 성능에 대한 경고가 남았을 것이지만 이것은 Access이며 아마도 수천/수만 행의 순서가 될 것입니다. – ydaetskcoR

0

나는 것은 문제도 문제가 "Y는/N" .IN Talend로했다 해결 한 우리는 또는 'N' 누군 데 수정 된 쿼리 구조를 다음과 같이 'Y'를 사용해야합니다

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'); 
관련 문제