2017-09-19 9 views
1

私は2つのテーブルを持っているが返されないSAS SQL更新が何も

\ partNumberも\ A $ \ sometext .... \ - 子の場合

と\ partNumber \ a $ \ - は親です。

そして私は2列でテーブルを作る必要があります - すべての子idのために私は親フォルダを取得する必要があります。 は、私はちょうどこの1

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

が、それでも同じ結果

のような別のオプションを試してみましたが、でもそれは私に0エラーやショーを与える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

なぜあなたはテーブルを作るために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 & '%'はあなたが望むことをしない可能性が非常に高いです。試してみてください:私はtrim()を追加しました.pn.dirPathは末尾の空白を持つ可能性があります。

+0

前に作成したテストで、すべての子IDを親IDで更新する前に読み込みます。また、エラーがなく、すべての行が更新されたように表示されます。テストテーブルの更新はまだありません。 –

+0

テーブルの作成はcreate + updateよりも高速です。また、元の問合せでは、ネストされた選択はテスト表のデータに依存せず、おそらく複数の値を戻します。 "eqt"を使用したTomのソリューションは、IMOの "好きな"よりも優れています。 – Petr