2017-08-31 1 views
0

Mes excuses pour le titre étrange. Je ne suis pas tout à fait sûr que c'est faisable en sql-like (redshift) mais nous pouvons essayer. J'ai deux tables. Un (nommé asm) avec quelque chose comme (tous les types sont texte):"Difficile" joindre entre les tableaux de type chaîne

hashid       kuids 
00009fff755fb6cafbfe1d3262d0a6d4 [LDydc6kP, LBzCi_CB, LBrFy7Ot] 
000bcb9ce17770ebb981e761ca71d395 [K2zw2pRu, LBbGkhWm] 

et un autre nom la comme:

kuid  lakuids 
LDydc6kP [KEqeQBJ8, KOvcq6TZ, K2zw2pRu, LQwVKtec, J6lfIKfY] 
Lb7PtjUG [JBsQJf1O, LcmasXTm, JkN5IhP4, LBbGkhWm] 

1) si kuid dans la est au moins dans un élément de kuid dans asm -> mettre hashid de asm dans la dans une nouvelle colonne (hashid) dans la (même ligne), sinon mettre « None »

2) Créer de nouvelles colonnes lahashids où la valeur est la liste de cartographie kuids par rapport Hached dans le tableau asm, et la colonne inconnue est la liste des lakuids ne sont pas présents dans la table kuids ** asm *

Je sais, ça a l'air étrange. Je suis ouvert à changer la structure de type et de la table ....

La réponse attendue devrait être pour la Table

kuid  lakuids            hashid        lahashids         unknown  
LDydc6kP [KEqeQBJ8, KOvcq6TZ, K2zw2pRu, LQwVKtec, J6lfIKfY] 00009fff755fb6cafbfe1d3262d0a6d4 [000bcb9ce17770ebb981e761ca71d395]   [KEqeQBJ8, KOvcq6TZ, LQwVKtec, J6lfIKfY]       
Lb7PtjUG [JBsQJf1O, LcmasXTm, JkN5IhP4, LBbGkhWm]    None        None          [JBsQJf1O, LcmasXTm, JkN5IhP4, LBbGkhWm] 
+0

Si cela est quelque chose comme tsql/mysql alors vous devriez utiliser une relation un à plusieurs entre hashid => kuid et une autre relation entre kuid => lakuid. Cela va simplifier votre adhésion. – Tom

+0

S'il vous plaît ** [modifier] ** votre question et ajouter la sortie attendue basée sur celle de vos échantillons. –

+0

Jetez un oeil à l'exemple que j'ai éditer, – user3620915

Répondre

0

Vous pouvez créer un Python UDF pour la correspondance de tableau qui renvoie un boolean comme celui-ci (a dû faire face à la même question dans le passé donc je partage):

CREATE OR REPLACE FUNCTION f_inlist(element varchar, list varchar) 
RETURNS boolean 
STABLE AS $$ 
if list==None: 
    return False 
list = list.strip('[').strip(']').split(',') 
if (element in list): 
    return True 
else: 
    return False 
$$ LANGUAGE plpythonu; 

, vous pouvez utiliser cette fonction comme condition de jointure comme ceci:

ON f_inlist(element_column, list_column)

Bien sûr, il est lent, alors il vaut mieux éviter une telle structure et déroulez listes en plusieurs lignes, mais si elle ne peut pas être évité c'est une façon d'aller

+0

Merci Alex. Je vais essayer ça. La table pour le moment est 4.5M et j'aimerais éviter le déballage. – user3620915