2017-09-19 1 views
1

J'ai 2 tables - parents et enfants, avec 2 colonnes dans chaque - id et adresse, et l'adresse ressemble à ceci -sas sql mise à jour ne retourne rien

\ partNumber \ a $ \ someText .... \ - pour enfant

et \ partNumber \ a $ \ - pour parent.

Et j'ai besoin d'en faire une table avec 2 colonnes - pour chaque identifiant d'enfant dont j'ai besoin pour obtenir son dossier parent. J'ai essayé de le faire comme cela en utilisant sql

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

vient d'essayer une autre option comme celui-ci

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

mais toujours le même résultat

Et même il me donne 0 erreur et montre dans un journal qu'il a fait des mises à jour sur tous les enregistrements , comme résultat final, je n'ai rien sur ma table.

+0

Pourquoi utilisez-vous UPDATE pour faire une table? Cela ne devrait-il pas être CREATE TABLE à la place? – Tom

+0

désolé, j'ai fait ce tableau avant, chargé des identifiants enfant et maintenant j'essaye d'ajouter ce parent ID –

+0

Les données d'échantillon (sous la forme d'une étape de données) aideraient beaucoup. – Tom

Répondre

2

Vous pouvez probablement utiliser la comparaison EQT pour trouver les adresses qui ont des préfixes similaires.

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; 

Résultats:

    parent_ 
Obs child_id  id  address       parent_address 

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

c'est incroyable. Ça marche. et merci de me montrer cette fonction eqt –

+0

'EQT' est un opérateur, fyi. – Joe

1

Je ne sais pas si je peux vous aider à ne pas savoir d'où vient la table Test. De toute façon, cn.dirPath like pn.dirPath & '%' ne fera probablement pas ce que vous voulez. Essayez cn.dirPath like trim(pn.dirPath) || '%'

Édition: J'ai ajouté trim(), pn.dirPath est susceptible d'avoir des espaces de fin.

+0

Testez comme créé avant et je charge tous les ID enfants avant de mettre à jour les ID parents. Et encore une fois même il n'a pas d'erreurs et montre que toutes les lignes ont été mises à jour Il n'y a toujours pas de mises à jour sur les tables de test lui-même –

+0

Créer une table est plus rapide que créer + mettre à jour. En outre, dans la requête d'origine, la sélection imbriquée ne dépend pas des données de la table de test et renvoie éventuellement plusieurs valeurs. La solution de Tom utilisant "eqt" est meilleure que "like" IMO. – Petr