2017-04-22 2 views
-1

J'ai le TABLEAU A avec l'une des colonnes contenant une valeur unique et le TABLEAU B avec l'une des colonnes contenant la liste des valeurs correspondantes possibles.Liste générique de nombres après virgule et jointure sur une seule valeur

Mon code ne semble prendre que les premiers éléments de la liste, mais ne va pas plus loin dans une liste pour trouver le numéro correspondant.

Pouvez-vous s'il vous plaît me aider à améliorer le code suivant:

select Logs.SingleValue, 
Instances.list from Logs,Instances 
where Logs.Column1=Instances.DeviceNumber and 
(',' + RTRIM(Instances.list) + ',') LIKE Logs.SingleValue 

Les données de la liste ressemble

106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120 

ou

3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360 

J'utilise SQL withn R progrograming enviorment pas sûr quelle version c'est la météo MS SQL ou ORACLE. Tout ce que je sais que j'ai trouvé un cas similaire et la commande n'a pas fonctionné, donc il doit être à la main en langage SQL pur.

Merci à l'avance

+0

Vos données CSV semblent contenir des espaces que votre expression 'LIKE' n'inclut pas. Mais à part cela, pourquoi stockez-vous vos données au format CSV en premier lieu? –

+0

J'utilise CSV car je n'ai pas de base de données sur le serveur sur lequel je travaille. Cela prendrait du temps à mettre en place. Maintenant, je reviens dans l'espace. Je pense qu'ils sont dans une liste de valeurs. Maintenant, je mets (', _' + RTRIM (Instances.list) + ', _') LIKE Logs.SingleValue ligne à la place, mais il n'a pas changé le nombre de résultats – Dominic

Répondre

2

La syntaxe ressemble t-sql, ce qui signifie qu'il est MS Sql Server.

Le meilleur conseil que je peux vous donner est de normaliser votre base de données - se débarrasser de cette colonne délimitée par des virgules et le déplacer vers une table.
Lisez Is storing a delimited list in a database column really that bad?, où vous verrez beaucoup de raisons pour lesquelles la réponse à cette question est Absolument oui!

Si vous ne pouvez pas faire cela, vous devriez probablement changer votre code sql actuel à quelque chose comme ceci:

select Logs.SingleValue, Instances.list 
from Logs 
inner join Instances ON Logs.Column1 = Instances.DeviceNumber 
and (', ' + RTRIM(Instances.slotlist2) + ',') LIKE '%, '+ Logs.Column2 +',%' 

De cette façon, vous devriez être en mesure d'obtenir tous les enregistrements où slotlist2 a le numéro dans Column2 quelque part dans la liste.
Notez l'espace après la première virgule des deux côtés de l'opérateur like.

Veuillez également noter que j'ai modifié votre jointure implicite en une jointure explicite.
Étant donné que les jointures explicites font partie d'ANSI SQL depuis plus de 25 ans, et que chaque rdbms qui les respecte les supporte, il n'est plus nécessaire d'utiliser des jointures implicites.

Modifier: J'ai testé ma requête, et cela semble fonctionner correctement.
You can look at it yourself on rextester.

+0

Je travaille sur CSV et utilise SQL dans R studio. Il n'y a pas de DB mais merci pour les conseils. J'ai exécuté le code modifié. Le résultat semble que le code ne considère que les premières valeurs de la liste et produit 252 lignes résultat de 5000 attendues. – Dominic

+0

Je ne connais rien à R, mais je connais sql. Je suis en train de lire ceci sur mon téléphone, donc je pourrais manquer quelque chose mais le code me semble bien. Je vais essayer de vérifier demain. –

+0

Eh bien pour moi il doit y avoir une déclaration en boucle disant (regardez d'abord et voir si elle correspond si pas regarder la seconde et voir si ...) Je ne suis pas sorcier en SQL mais il semble qu'il ignore tout sauf les premières valeurs la séquence. (Je suppose aussi que R n'est pas le cas car SQL fonctionne bien jusqu'à ce cas) J'apprécie énormément votre engagement! – Dominic

0

Result of most recent Query

Alors que sur l'écran tourné il semble être le problème soit avec une requête ou un ensemble dans un studio de R qui permet de faire fonctionner SQL sur les fichiers CSV sans la base de données.

Cordialement

Dominik

post-scriptum La publication originale contient des noms de colonne renommés juste pour simplifier le cas que je suis après avoir résolu.