Aller au contenu

requete SQL


jon152

Messages recommandés

Bonjour alors je suis entrain de galerer sur une requete SQL et je suis perdu 

Les infos dont je dispose :

 

Alors j’ai 3 tables

Nommé Doc, Yref et VariableValue

Dans Doc j’ai les colonnes suivantes DocID et filename

Dans Yref j’ai DocID et YrefDoc

Dans VariableValue j’ai DocID et variableID

 

En entrée j’ai un filename

Je souhaite obtenir le valuetext d’un autre Filnename qui est associé aux premier Filename

 

Ma démarche :

En entrée j’ai un Filename (exemple : AAA) qui peut me donner un DocID (ce DocID est unique)

(ce Filename(AAA) d’entrée il y en a qu’un qui aura ce nom dans la base par contre d’autres FileName sont présent en plusieurs exemplaires il y aura plusieurs feuille<1> par exemple avec des DocID différents)

 Ce DocID me permet de lister tous les YrefDoc liés à ce Doc ID. (même si ce n’est pas écrit mais ce YrefDoc correspond aux DocID) (j’ai l’impression qu’il y a comme un mappage)

 Il me faut le numéro YrefDoc dont le filename est feuille<1> (mais comme il y en a une multitude de feuille<1> il me faut celui qui est en rapport avec mon filename AAA)

 Ensuite de ce feuille<1> je souhaite obtenir le VariableValue d’une variable qui se nomme 84.

 

Si quelqu'un peut m'aider merci d'avance

SELECT *
FROM dbo.VariableValue
FULL JOIN dbo.Documents ON dbo.VariableValue.DocumentID = dbo.Documents.DocumentID
FULL JOIN dbo.Xrefs ON dbo.Documents.DocumentID = dbo.Xrefs.XRefDocument

where dbo.Documents.DocumentID IN (select DocumentID from dbo.VariableValue where Filename = 'CP05L10131E (5).SLDPRT') 


 

 

Lien vers le commentaire
Partager sur d’autres sites

De ce que j'ai compris :

une table doc avec une ref+ un nom de fichier
une table avec un deux clé étrangere vers la mm table (la table doc) avec genre une ref parent et une ref enfants ( pour avoir plusieur enfant pour le même fileName)
et une troisieme avec une clé etrangere vers doc et une vers une table variable inconnu 

A ca moi je dis que la deuxième table devrai pas exister... une clé étrangère vers le parent directement dans la table doc suffirai...

Lien vers le commentaire
Partager sur d’autres sites

@jon152 ton post est malheureusement assez confus. Quelques conseils pour tes prochaines questions. Pour faciliter la lecture, il faudrait que tu donnes le nom exact de tes tables/colonnes et que tu t'y tiennes dans le reste du texte. Les noms dans ta requete sont différents de ceux cités plus haut. De plus, certaines tables semblent incomplètes. D'où vient " valuetext " ? Enfin, identifie clairement les valeurs (entre " " par exemple).

Si j'ai bien compris, la table YrefDoc est une table de jointure entre DOC et elle même, comme le dit Lalanth. Cette table est inutile si la relation est 1,n (les documents enfants ne peuvent avoir qu'un document parent). Sinon, elle est obligatoire.
La table VariableValue est une table contenant les variables pour un DOC donné (d'où la FK DocId).

Et ce que tu cherches, c'est la ligne de VariableValue liés aux documents enfants d'un document donné, et pour un variableID donné.

Ca devrait donner quelque chose du genre (ce qui ressemble bcp à ta requête)

select var_c.*
from YrefDoc left join Doc doc_c on doc_c.DocId = y.YrefDoc
left join VariableValue var_c on var.docId = y.YrefDoc
where y.DocId in ( select doc_p.docId from Doc doc_p where doc_p.filename = <nom du filename> )
and var_c.variableId = <id de la variable>

requête inutilement compliquée et avec des fautes. Ca m'apprendra à ne pas me relire. Voir plus bas

Lien vers le commentaire
Partager sur d’autres sites

il y a 8 minutes, fragzepika a dit :

@jon152 ton post est malheureusement assez confus. Quelques conseils pour tes prochaines questions. Pour faciliter la lecture, il faudrait que tu donnes le nom exact de tes tables/colonnes et que tu t'y tiennes dans le reste du texte. Les noms dans ta requete sont différents de ceux cités plus haut. De plus, certaines tables semblent incomplètes. D'où vient " valuetext " ? Enfin, identifie clairement les valeurs (entre " " par exemple).

Si j'ai bien compris, la table YrefDoc est une table de jointure entre DOC et elle même, comme le dit Lalanth. Cette table est inutile si la relation est 1,n (les documents enfants ne peuvent avoir qu'un document parent). Sinon, elle est obligatoire.
La table VariableValue est une table contenant les variables pour un DOC donné (d'où la FK DocId).

Et ce que tu cherches, c'est la ligne de VariableValue liés aux documents enfants d'un document donné, et pour un variableID donné.

Ca devrait donner quelque chose du genre (ce qui ressemble bcp à ta requête)


select var_c.*
from YrefDoc left join Doc doc_c on doc_c.DocId = y.YrefDoc
left join VariableValue var_c on var.docId = y.YrefDoc
where y.DocId in ( select doc_p.docId from Doc doc_p where doc_p.filename = <nom du filename> )
and var_c.variableId = <id de la variable>

 

Le script de création des tables ainsi que du contenu est un plus

Lien vers le commentaire
Partager sur d’autres sites

il y a 9 minutes, djey37 a dit :

Le script de création des tables ainsi que du contenu est un plus

Effectivement, ça aurait été le plus simple surtout qu'il y a peu de tables et qu'elles sont petites.
 

 

il y a 9 minutes, latlanh a dit :

Ou au moins un MCD ou MLD ou MPD pour y voir claire!^^

Ca, ce serait le pied. Mais, ces documents sont malheureusement trop rares.

Lien vers le commentaire
Partager sur d’autres sites

il y a 1 minute, fragzepika a dit :

Effectivement, ça aurait été le plus simple surtout qu'il y a peu de tables et qu'elles sont petites.
 

 

Ca, ce serait le pied. Mais, ces documents sont malheureusement trop rares.

A ben chez nous on le fait tout le temps (c'est bien le seul truc...)

Lien vers le commentaire
Partager sur d’autres sites

il y a 5 minutes, cadegenere a dit :

Moi j'ai compris ça :


select v.VariableID
from Yref y left join VariableValue v on (y.DocID = v.DocID) 
where y.YrefDoc in (
	select d.DocID 
	from Doc d 
	where d.FileName = 'AAA')
)

 

Putain ... tu as raison, j'ai une jointure en trop. Ca ne sert à rien de joindre à Doc pour les docuemernts enfants, on a besoin que de leurs Id déjà données par la colonne YrefDoc dans Yref.

Ca donnerait donc ça (en ajoutant la contrainte sur l'id de la variable) :

select var_c.*
from YrefDoc y left join VariableValue var_c on var_c.docId = y.YrefDoc
where y.DocId in ( select doc_p.docId from Doc doc_p where doc_p.filename = <nom du filename> )
and var_c.variableId = <id de la variable>

 

Lien vers le commentaire
Partager sur d’autres sites

il y a 3 minutes, fragzepika a dit :

Putain ... tu as raison, j'ai une jointure en trop. Ca ne sert à rien de joindre à Doc pour les docuemernts enfants, on a besoin que de leurs Id déjà données par la colonne YrefDoc dans Yref.

Ca donnerait donc ça (en ajoutant la contrainte sur l'id de la variable) :


select var_c.*
from YrefDoc y left join VariableValue var_c on var_c.docId = y.YrefDoc
where y.DocId in ( select doc_p.docId from Doc doc_p where doc_p.filename = <nom du filename> )
and var_c.variableId = <id de la variable>

 

C'est pas le variableId qu'il veut obtenir justement (celui que tu passes en condition) ?
Ou c'est que je n'ai pas bien compris ce que valueText était (ni où il était d'ailleurs).

Lien vers le commentaire
Partager sur d’autres sites

à l’instant, cadegenere a dit :

C'est pas le variableId qu'il veut obtenir justement (celui que tu passes en condition) ?
Ou c'est que je n'ai pas bien compris ce que valueText était (ni où il était d'ailleurs).

@jon152 a dit :

Citation

Ensuite de ce feuille<1> je souhaite obtenir le VariableValue d’une variable qui se nomme 84.

Donc, j'ai supposé que ça deviat être le variableId. On rejoint le problème que j'ai remonté dans ma première réponse : la description du problème est confuse.

Lien vers le commentaire
Partager sur d’autres sites

Je suis désolé pour la mise en forme et les couleurs :/

En plus d'etre nul en SQL je suis colorBlind :)

alors je suis désolé pour les explications un peu confusent mais ça fait 2 ou 3 jours que je m'énerve dessus je viens de me rendre compte que j'ai oublié de dire que dans  la tableVariableValue il y a un champ valuetext 

Sans titre.jpg

Lien vers le commentaire
Partager sur d’autres sites

Salut,

De ce que j'ai compris par rapport au schéma (je n'ai pas tout lu). Déjà, tes tables sont mal nommées à mon avis ^^.

Elles sont censées représenter des objets métier j'imagine. Il serait donc bien qu'on comprenne directement leurs contenus sans devoir les requêter.

Ensuite, quelles sont les cardinalités entre les trois tables ? Ce que tu en dis n'est pas très clair.

Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, jon152 a dit :

Je suis désolé pour la mise en forme et les couleurs :/

En plus d'etre nul en SQL je suis colorBlind :)

alors je suis désolé pour les explications un peu confusent mais ça fait 2 ou 3 jours que je m'énerve dessus je viens de me rendre compte que j'ai oublié de dire que dans  la tableVariableValue il y a un champ valuetext 

Sans titre.jpg

J'insiste pour avoir les scripts de création de tables.

Sur ton schéma, on ne voit pas les cardinalités, les FK et les PK. Cela va nous aider pour savoir dans un 1er temps si tu as fait une erreur de conception de BDD.

Quel IDE utilises tu pour executer tes requetes SQL ? php my admin ? sql developper ? autre. Plus tu nous fournis d'informations et plus nous pourrons t'aiguiller sur la solution la plus logique.

Lien vers le commentaire
Partager sur d’autres sites

il y a 13 minutes, cadegenere a dit :

@djey37 Si j'ai bien compris, les YrefDocs sont aussi des clés vers Document. Et je ne suis pas sûr que le YrefsId existe. Pour le reste, ça doit ressembler à ça oui.

J'ai rajouté le yrefsid parce qu'il n'y a pas d'identifiant sur cette table dans l'énoncé de @jon152 ce qui me parait aberrant.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...