2017-09-19 48 views
1

我有2個表 - 父母和孩子,在每2列 - 編號和地址,以及地址看起來是這樣的 -SAS SQL更新沒有返回

\ PARTNUMBER \一個$ \ sometext .... \ - 兒童

和\ partNumber \ a $ \ - 對於父母。

我需要用2列製作一張表格 - 對於需要獲取其父文件夾的每個子標識符。 我試圖通過使用SQL

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

使它像這樣只是嘗試另一種選擇這樣一個

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錯誤和表演在日誌中,它對所有 記錄進行了更新,作爲最終結果,我在桌面上什麼都沒有。

+0

你爲什麼要使用Update以表?不應該是CREATE TABLE嗎? – Tom

+0

對不起,我之前製作過這張表,現在我正在嘗試添加這個父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

我不確定是否可以幫助不知道表Test的來源。

無論如何,cn.dirPath like pn.dirPath & '%'很可能不會做你想做的事。嘗試cn.dirPath like trim(pn.dirPath) || '%'

編輯:我添加trim(),pn.dirPath可能會有尾隨空白。

+0

之前創建的測試,我加載所有的小孩ID之前,我加註與父母的ID更新。再次,即使它沒有錯誤,並顯示像所有行更新仍然沒有更新測試表其自己 –

+0

創建表比創建更新更快。此外,在原始查詢中,嵌套選擇不依賴於測試表中的數據,並可能返回多個值。使用「eqt」的湯姆解決方案比「像」IMO更好。 – Petr