OVH Cloud OVH Cloud

Requete SQL

8 réponses
Avatar
I.G.LOG
Bonjour,

Aux spécialiste SQL
(Je suis en WD11 dernière version sur HF classic)


J'ai trois tables:
La table DOCUMLG contient IDDOCUMLG
La table T_DONNC contient IDDOCUMLG,IDNUMSERIE
La table NUMSERIE contient IDNUMSERIE

Pour chaque DOCUMLG je peut avoir ou pas un lien dans la table T_DONNC (par
IDDOCUMLG).
Si ce lien existe, j'ai nécessairement un lien dans NUMSERIE (par
IDNUMSERIE)

DOCUMLG (1,n) <-----> T_DONNC (0,1) <------> NUMSERIE (1,1)


Comment récupérer toutes les lignes de DOCUMLG avec leur N° de série (ou pas
!!!) en SQL

J'ai essayé les requètes suivantes, sans succès

select * from DOCUMLG left join (T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG),
NUMSERIE
where NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE

ne me renvoi pas ce que je cherche (normal, dans le cas ou T_DONNC ne
contient pas de lien, le "where NUMSERIE..." va retourner FAUX)


select * from DOCUMLG left join T_DONNC on (T_DONNC.IDDOCUMLG =
DOCUMLG.IDDOCUMLG),
NUMSERIE left join T_DONNC on (NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE)

Sur cete dernière j'ai une erreur à l'exécution "IDDOCUMLG non amorcé..."


En fait je veux pouvoir recupérer les enregistrements de DOCUMLG qu'ils
aient ou non un n° de série

Mercc à tous

8 réponses

Avatar
Emprin, Frederic
Bonjour,


SEELCT * from DOCUMLG
LEFT JOIN T_DONNC
ON T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG
LEFT JOIN NUMSERIE
ON NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE

cela va renvoyer toutes les ligne de documlg
avec ou pas leur n° de serie

c'est avoir mis NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE
dans le where qui casse le left join et fait une jointure interne

avec le where au niveau du on ca change tout


Bon dev
@+


"I.G.LOG" a écrit dans le message de news:
45c2020c$0$5104$
Bonjour,

Aux spécialiste SQL
(Je suis en WD11 dernière version sur HF classic)


J'ai trois tables:
La table DOCUMLG contient IDDOCUMLG
La table T_DONNC contient IDDOCUMLG,IDNUMSERIE
La table NUMSERIE contient IDNUMSERIE

Pour chaque DOCUMLG je peut avoir ou pas un lien dans la table T_DONNC
(par
IDDOCUMLG).
Si ce lien existe, j'ai nécessairement un lien dans NUMSERIE (par
IDNUMSERIE)

DOCUMLG (1,n) <-----> T_DONNC (0,1) <------> NUMSERIE (1,1)


Comment récupérer toutes les lignes de DOCUMLG avec leur N° de série (ou
pas
!!!) en SQL

J'ai essayé les requètes suivantes, sans succès

select * from DOCUMLG left join (T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG),
NUMSERIE
where NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE

ne me renvoi pas ce que je cherche (normal, dans le cas ou T_DONNC ne
contient pas de lien, le "where NUMSERIE..." va retourner FAUX)


select * from DOCUMLG left join T_DONNC on (T_DONNC.IDDOCUMLG > DOCUMLG.IDDOCUMLG),
NUMSERIE left join T_DONNC on (NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE)

Sur cete dernière j'ai une erreur à l'exécution "IDDOCUMLG non amorcé..."


En fait je veux pouvoir recupérer les enregistrements de DOCUMLG qu'ils
aient ou non un n° de série

Mercc à tous




Avatar
I.G.LOG
Bonjour
Merci de la réponse, je fais l'essai

"Emprin, Frederic" a écrit dans le message de
news:45c20807$0$26744$
Bonjour,


SEELCT * from DOCUMLG
LEFT JOIN T_DONNC
ON T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG
LEFT JOIN NUMSERIE
ON NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE

cela va renvoyer toutes les ligne de documlg
avec ou pas leur n° de serie

c'est avoir mis NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE
dans le where qui casse le left join et fait une jointure interne

avec le where au niveau du on ca change tout


Bon dev
@+


"I.G.LOG" a écrit dans le message de news:
45c2020c$0$5104$
> Bonjour,
>
> Aux spécialiste SQL
> (Je suis en WD11 dernière version sur HF classic)
>
>
> J'ai trois tables:
> La table DOCUMLG contient IDDOCUMLG
> La table T_DONNC contient IDDOCUMLG,IDNUMSERIE
> La table NUMSERIE contient IDNUMSERIE
>
> Pour chaque DOCUMLG je peut avoir ou pas un lien dans la table T_DONNC
> (par
> IDDOCUMLG).
> Si ce lien existe, j'ai nécessairement un lien dans NUMSERIE (par
> IDNUMSERIE)
>
> DOCUMLG (1,n) <-----> T_DONNC (0,1) <------> NUMSERIE (1,1)
>
>
> Comment récupérer toutes les lignes de DOCUMLG avec leur N° de série (ou
> pas
> !!!) en SQL
>
> J'ai essayé les requètes suivantes, sans succès
>
> select * from DOCUMLG left join (T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG),
> NUMSERIE
> where NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE
>
> ne me renvoi pas ce que je cherche (normal, dans le cas ou T_DONNC ne
> contient pas de lien, le "where NUMSERIE..." va retourner FAUX)
>
>
> select * from DOCUMLG left join T_DONNC on (T_DONNC.IDDOCUMLG > > DOCUMLG.IDDOCUMLG),
> NUMSERIE left join T_DONNC on (NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE)
>
> Sur cete dernière j'ai une erreur à l'exécution "IDDOCUMLG non


amorcé..."
>
>
> En fait je veux pouvoir recupérer les enregistrements de DOCUMLG qu'ils
> aient ou non un n° de série
>
> Mercc à tous
>
>




Avatar
I.G.LOG
Bon après différents essais, impossible de retrouver les bonnes valeurs !!!
Voici la requete sur laquelle je fais des essais, qui devrait me retourner
tous les documents DOCUM de type 20 comportant une ligne dans DOCUMLG avec
NUMGRP = 0 et ceci qu'il y ait un n° de série ou pas !!!

select REFDOC,NUMSERIE.NUMSERIE
from DOCUM,DOCUMLG left join T_DONNC on (T_DONNC.ID_LIGNE DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)
left join NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

Cette requète me retourne seulement une partie des enregistrements, et pas
tous ceux que je devrait avoir !!!

DOCUMLG (1,n) <-----> T_DONNC (0,1) <------> NUMSERIE (1,1)

Je ne comprends pas pourquoi !!!

Merci à vous tous (et notamment Frederic qui s'est interessé au problème)


"Emprin, Frederic" a écrit dans le message de
news:45c20807$0$26744$
Bonjour,


SEELCT * from DOCUMLG
LEFT JOIN T_DONNC
ON T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG
LEFT JOIN NUMSERIE
ON NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE

cela va renvoyer toutes les ligne de documlg
avec ou pas leur n° de serie

c'est avoir mis NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE
dans le where qui casse le left join et fait une jointure interne

avec le where au niveau du on ca change tout


Bon dev
@+



Avatar
I.G.LOG
A titre d'exemple, j'execute les deux requetes suivantes:

select REFDOC
from DOCUM,DOCUMLG
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

me donne 8986 enregistrements

alors que

select REFDOC,NUMSERIE.NUMSERIE
from DOCUM,DOCUMLG left join T_DONNC on (T_DONNC.ID_LIGNE DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)
left join NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

m'en renvoi seulement 907 ??? la combinaison de left join m'a donc supprimé
8000 tuples alors que je cherche à ce que la ligne soit sélectionnée qu'elle
ait un lien avec S/N ou pas !!!


Encore merci
Avatar
Emprin, Frederic
ha j'avais pas vu la table docum je croyais qu'on avais documlg seulement
donc la requete que tu cherche :

SELECT REFDOC,NUMSERIE.NUMSERIE

FROMDOCUM

LEFT JOIN DOCUMLG
on (DOCUMLG.IDDOCUM = DOCUM.IDDOCUM and DOCUM.IDTYPE = 20)

LEFT JOIN T_DONNC
on (T_DONNC.ID_LIGNE = DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)

LEFT JOIN NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)

where DOCUMLG.NUMGRP = 0

devrait mieu fonctionné
je n'avais pas vu la jointure entre docum et documlg

@+

"I.G.LOG" a écrit dans le message de news:
45c333a4$0$27403$
Bon après différents essais, impossible de retrouver les bonnes valeurs
!!!
Voici la requete sur laquelle je fais des essais, qui devrait me retourner
tous les documents DOCUM de type 20 comportant une ligne dans DOCUMLG avec
NUMGRP = 0 et ceci qu'il y ait un n° de série ou pas !!!

select REFDOC,NUMSERIE.NUMSERIE
from DOCUM,DOCUMLG left join T_DONNC on (T_DONNC.ID_LIGNE > DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)
left join NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

Cette requète me retourne seulement une partie des enregistrements, et pas
tous ceux que je devrait avoir !!!

DOCUMLG (1,n) <-----> T_DONNC (0,1) <------> NUMSERIE (1,1)

Je ne comprends pas pourquoi !!!

Merci à vous tous (et notamment Frederic qui s'est interessé au problème)


"Emprin, Frederic" a écrit dans le message de
news:45c20807$0$26744$
Bonjour,


SEELCT * from DOCUMLG
LEFT JOIN T_DONNC
ON T_DONNC.IDDOCUMLG = DOCUMLG.IDDOCUMLG
LEFT JOIN NUMSERIE
ON NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE

cela va renvoyer toutes les ligne de documlg
avec ou pas leur n° de serie

c'est avoir mis NUMSERIE.IDNUMSERIE = T_DONNC.IDNUMSERIE
dans le where qui casse le left join et fait une jointure interne

avec le where au niveau du on ca change tout


Bon dev
@+







Avatar
Bob
In article <45c33521$0$5108$,
says...
A titre d'exemple, j'execute les deux requetes suivantes:

select REFDOC
from DOCUM,DOCUMLG
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

me donne 8986 enregistrements

alors que

select REFDOC,NUMSERIE.NUMSERIE
from DOCUM,DOCUMLG left join T_DONNC on (T_DONNC.ID_LIGNE =
DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)
left join NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

m'en renvoi seulement 907 ??? la combinaison de left join m'a donc suppri mé
8000 tuples alors que je cherche à ce que la ligne soit sélectionné e qu'elle
ait un lien avec S/N ou pas !!!




Peut être qu'un LEFT OUTER JOIN serait plus adapté

Bob.
Avatar
Bob
In article ,
says...

Peut être qu'un LEFT OUTER JOIN serait plus adapté



Je me réponds a moi même, a priori le OUTER est optionnel pour certains
SQL :)

Bob, on en apprend tous les jours
Avatar
I.G.LOG
>
SELECT REFDOC,NUMSERIE.NUMSERIE

FROMDOCUM

LEFT JOIN DOCUMLG
on (DOCUMLG.IDDOCUM = DOCUM.IDDOCUM and DOCUM.IDTYPE = 20)

LEFT JOIN T_DONNC
on (T_DONNC.ID_LIGNE = DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)

LEFT JOIN NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)

where DOCUMLG.NUMGRP = 0

devrait mieu fonctionné
je n'avais pas vu la jointure entre docum et documlg




Bonsoir,
Eh bien non après essais cette requète fonctionne mais ne me retourne pas
les valeurs escomptées... et je ne comprends pas pourquoi ?!!!

j'ai fait les tests suivants (voir mes posts plus bas)

select REFDOC
from DOCUM,DOCUMLG
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

me donne 8986 enregistrements

alors que

select REFDOC,NUMSERIE.NUMSERIE
from DOCUM,DOCUMLG left join T_DONNC on (T_DONNC.ID_LIGNE DOCUMLG.IDDOCUMLG and T_DONNC.ID_COL = 40)
left join NUMSERIE on (NUMSERIE.IDNUMSERIE = T_DONNC._VALEUR)
where DOCUM.IDTYPE = 20
and DOCUMLG.IDDOCUM = DOCUM.IDDOCUM
and DOCUMLG.NUMGRP = 0

ne m'en retourne que 907, alors que je ne vois pas la différence au niveau
de ces 2 requetes !!!

Encore merci si tu as une idée du problème