Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment joindre deux tables basées sur des valeurs de sous-chaîne de champs ?

Tant de façons de le faire. Ce serait une bonne idée d'examiner le plan d'explication de différentes manières avant de s'engager dans une méthode particulière. Par exemple, s'il existe un index basé sur la fonction sur EMPLOYEE comme SUBSTR(id, 2, LENGTH(id) - 1) alors vous voudrez l'utiliser dans votre requête :

SELECT e.name, i.name
  FROM employee e INNER JOIN instructor i
    ON SUBSTR(e.id, 2, LENGTH(e.id) - 1) = SUBSTR(i.id, 2, LENGTH(i.id) - 1);

Une autre question est de savoir si les valeurs dans le id colonne ont toujours la même longueur dans EMPLOYEE et INSTRUCTOR . Et s'ils sont de longueurs différentes ? Peut-être que l'un a plus de rembourrage qu'un autre. De plus, seront-ils toujours des chiffres à l'exception d'un u initial ? Si tel est le cas, il peut être intéressant d'essayer un TO_NUMBER() sûr transformation :

SELECT e.name, i.name
  FROM employee e INNER JOIN instructor i
    ON TO_NUMBER(REGEXP_SUBSTR(e.id, '\d+$')) = TO_NUMBER(REGEXP_SUBSTR(i.id, '\d+$'));

Une autre chose que vous voudrez peut-être considérer, cependant - y a-t-il une raison pour le premier u dans le EMPLOYEE id colonne? Peut-il y avoir d'autres personnages principaux ? Est-ce que le premier u représenter quelque chose (en violation de la première forme normale, mais cela arrive) ?