Comment joindre deux tables sur la base des sous-chaîne de valeurs de champs?
Je vais avoir des problème avec sql. Je veux me joindre deux tables, l'employé et l'instructeur de classe. Condition est que l'employé a de la unid colonne comme "u0871457" où comme instructeur de classe est d'avoir le numéro d'identification comme "00871457'.
Je veux juste remplacer le premier caractère du numéro d'identification à la 'u' pour rejoindre pour correspondre à la chaîne venant de unid . Comment puis-je le faire? J'ai essayé jusqu'à présent :
select e.name, i.name
from Employee e
inner join Instructor i on SUBSTR(e.id,1, LENGTH(e.id )) = SUBSTR(i.id,1, LENGTH(i.id ))
mais c'est ce qui a résulté en un jeu de résultats vide.
Toute aide sera appréciée. Merci pour votre temps!
Pourquoi êtes-vous sous-Chaîne des deux côtés ? À partir de votre description, vous ne voulez SUBSTR un côté?
OriginalL'auteur userx | 2015-02-20
Vous devez vous connecter pour publier un commentaire.
Tellement de façons de le faire. Ce serait une bonne idée de regarder le plan d'expliquer de différentes façons avant de s'engager à une méthode particulière. Par exemple, si il y a une fonction d'index de base sur
EMPLOYEE
commeSUBSTR(id, 2, LENGTH(id) - 1)
alors vous aurez envie de l'utiliser dans votre requête:Une autre question est de savoir si les valeurs de la
id
colonne sont toujours de la même longueur dansEMPLOYEE
etINSTRUCTOR
. Ce qui si elles sont de longueurs différentes? Peut-être que l'un a plus de rembourrage que l'autre. Aussi, seront-ils toujours chiffres en dehors de l'un des principauxu
? Si oui, alors il pourrait être intéressant d'essayer un coffre-fortTO_NUMBER()
de conversion:Une autre chose que vous pourriez envisager, cependant -- est-il une raison pour le premier
u
dans leEMPLOYEE
id
de la colonne? Peut-il y avoir d'autres personnages principaux? Le leaderu
tenir pour quelque chose (en violant la première forme normale, mais ce qui se passe)?+ 1 surtout pour les REGEXP suggestion
OriginalL'auteur David Faber
Oracle utilise 1 comme la base de son index, pour
substr('aaa',1,3)
est équivalent à'aaa'
. Vous devez utiliser 2 comme deuxième paramètre desubstr
afin d'accomplir ce que vous tentez.Au-delà, vous seriez probablement mieux en changeant seulement d'un côté, si vous le pouvez. Si le préfixe caractères sont compatibles, vous pourriez faire ceci:
Ce serait de permettre à la base de données à utiliser un index sur
instructor
, qui ne serait pas possible avec votre solution.which would not be possible with your solution
- on peut utiliser une fonction d'index de base:SUBSTR(id, 2, LENGTH(id) - 1)
OriginalL'auteur Allan
La position de caractère est mal. Vous devriez commencer votre sous-chaîne à la position 2 (le premier caractère de la chaîne est de 1 et non de 0).
De l'autre côté, vous êtes à l'aide de la fonction SUBSTR sur les deux cordes alors que vous devez utiliser uniquement sur l'id de l'employé. Attention, si les deux identifiants sont des chaînes de caractères, la longueur sera différent.
Simplement si vous voulez seulement changer le " u " sur l'id de l'employé, essayer avec la fonction de traduction.
Syntaxe
OriginalL'auteur Santiago P
Votre base de données utilise 1 à base d'indexation.
OriginalL'auteur Emanuel Saringan