2017-09-19 12 views
1

을 반환SAS SQL 업데이트는 내가 2 개 테이블이 아무것도

\ PARTNUMBER 달러 (A $)의 \의 sometext \ .... \ - 하위 용

및 부모 용 \ partNumber \ a $ \ -.

그리고 2 열로 테이블을 만들어야합니다. 모든 하위 ID에 대해 상위 폴더를 가져와야합니다. 난 그냥이 하나

update work.Test 
set parent_id = (select pn.DirId 
        from work.Parent pn 
        join work.Child cn on 
        cn.dirPath = substr(pn.dirPath, 1, index('%', pn.dirPath) +1)); 

같은 다른 옵션을하지만 여전히 같은 결과를 시도 SQL

update work.Test 
set parent_id = (select pn.DirId 
from work.Parent pn 
join work.Child cn on cn.dirPath like pn.dirPath & '%'); 

를 사용하여이처럼 만들려고

그리고 심지어는 나에게 0 오류와 쇼를 제공합니다 모든 레코드에 대한 업데이트를 기록한 로그에서 최종 결과로 아무 것도 얻지 못했습니다.

+0

왜 테이블을 만들려면 UPDATE를 사용하고 있습니까? 그 테이블 대신 CREATE TABLE을 사용하면 안됩니까? – Tom

+0

미안하지만,이 테이블을 만들기 전에 하위 ID를로드하고 이제이 부모 ID를 추가하려고합니다. –

+0

샘플 데이터 (데이터 단계 형태로)가 도움이 될 것입니다. – Tom

답변

2

EQT 비교를 사용하면 유사한 접두사가있는 주소를 찾을 수 있습니다.

data child ; 
    input child_id address $50. ; 
cards; 
1 \partNumber\a$\sometext....\ 
2 no_parent 
; 
data parent ; 
    input parent_id address $50.; 
cards; 
501 \partNumber\a$\ 
; 

proc sql ; 
    create table want as 
    select a.child_id,b.parent_id,a.address,b.address as parent_address 
    from child a 
    left join parent b 
    on a.address eqt b.address 
    ; 
quit; 

결과 :

    parent_ 
Obs child_id  id  address       parent_address 

1   1   501  \partNumber\a$\sometext....\ \partNumber\a$\ 
2   2   .  no_parent 
+0

놀랍습니다. 그것은 작동합니다. 이 eqt 함수를 보여 주셔서 감사합니다. –

+0

'EQT'는 연산자입니다, fyi. – Joe

1

테스트 테이블의 출처를 알 수 없으면 잘 모르겠습니다.

어쨌든 cn.dirPath like pn.dirPath & '%'은 사용자가 원하는 것을하지 않을 가능성이 큽니다. 시도하십시오. cn.dirPath like trim(pn.dirPath) || '%'

편집 : trim()을 추가 했으므로 pn.dirPath에 후행 공백이있을 수 있습니다.

+0

이전에 만든대로 테스트하고 부모 ID로 업데이트하기 전에 모든 하위 ID를로드합니다. 그리고 심지어는 오류가없고 모든 행이 업데이트 된 것처럼 보여줍니다. 테스트 테이블 자체에 대한 업데이트가 아직 없음 –

+0

테이블 만들기가 create + update보다 빠릅니다. 또한 원래 쿼리에서 중첩 된 선택 항목은 테스트 테이블의 데이터에 종속되지 않으며 둘 이상의 값을 반환 할 수 있습니다. "eqt"를 사용하는 Tom의 솔루션은 "IMO"보다 낫습니다. – Petr