transformation d'une requete SQLserver en requeteORACLE [SGBD][ORACLE] - SQL/NoSQL - Programmation
Marsh Posté le 16-09-2003 à 16:54:57
essaye ça ...
Bon niveau du placement du (+)
j'espère pas m'être gouré !
Sinon t'inverse tout
create view tmp2
as
SELECT emploi.id emploiid, count(*) effectif
FROM dtable famille, dtable metier, dtable emploi, pers_v volet_personne
WHERE famille.nom_table = 'NOMGPE0'
AND famille.id = metier.lien
AND metier.id = emploi.lien
AND emploi.id = volet_personne.id_table
AND famille.des like 'i%' GROUP BY emploi.id
create view tmp
as
SELECT poste.id posteid, count(*) effectif
FROM dtable famille, dtable metier, dtable emploi, dtable poste, pers_v volet_personne
WHERE famille.nom_table = 'NOMGPE0' AND famille.id = metier.lien
AND metier.id = emploi.lien AND emploi.id = poste.lien
AND poste.id = volet_personne.id_table
AND famille.des like 'i%' GROUP BY poste.id
SELECT famille.id idfamille, famille.code codefamille, famille.des desfamille, famille.com comfamille,
metier.id idmetier, metier.code codemetier, metier.des desmetier, metier.com commetier, emploi.id idemploi,
emploi.code codeemploi, emploi.des desemploi, emploi.com comemploi, poste.id idposte, poste.code codeposte,
poste.des desposte, poste.com composte ,tmp.effectif effectifPoste,tmp2.effectif effectifEmploi
FROM
dtable famille,
dtable metier,
dtable emploi,
dtable poste,
tmp2 ,
tmp
WHERE famille.nom_table = 'NOMGPE0' and
famille.id = metier.lien (+) and
metier.id = emploi.lien (+) and
emploi.id = poste.lien (+) and
tmp2.emploiid (+) = emploi.id and
tmp.posteid (+)= poste.id and
famille.des like 'i%'
ORDER BY famille.des, metier.des, emploi.des, poste.des
sachant que
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
je cite
Jointure externe
Lorsqu'une ligne d'une table figurant dans une jointure n'a pas de correspondant dans les autres tables, elle ne satisfait pas au critère d'équi-jointure et donc ne figure pas dans le résultat de la jointure.
Une option permet de faire figurer dans le résultat les lignes satisfaisant la condition d'équi-jointure plus celles n'ayant pas de correspondant. Cette option s'obtient en accolant (+) au nom de colonne de la table dans laquelle manquent des éléments, dans la condition d'équi-jointure.
Exemple : Le département 40 ne figurait pas dans le résultat du SELECT précédent. Par contre, il figurera dans le résultat du SELECT suivant.
SELECT emp.nom, lieuFROM emp, deptWHERE emp.n_dept(+) = dept.n_dept;
Le (+) peut s'interpréter comme l'ajout d'une ligne fictive dont toutes les colonnes ont la valeur NULL, et qui réalise la correspondance avec les lignes de l'autre table qui n'ont pas de correspondant réel. Dans l'exemple ci-dessus, la valeur de nom associée au département 40 est la valeur NULL.
Si t'as des soucis en Oracle va faire un tour sous
http://www.developpez.net/forums/
et pose tes questions ...
Marsh Posté le 16-09-2003 à 16:36:24
bonjour;
je n'ai jamais travaillé avec oracle et je manque cruellement de documentation donc si qqun pouvait me fournir des liens ca serait sympa.
Mon problème est le suivant je dois faire fonctionner ma requete SQL server sous oracle :
SELECT famille.id idfamille, famille.code codefamille, famille.des desfamille, famille.com comfamille,
metier.id idmetier, metier.code codemetier, metier.des desmetier, metier.com commetier, emploi.id idemploi,
emploi.code codeemploi, emploi.des desemploi, emploi.com comemploi, poste.id idposte, poste.code codeposte,
poste.des desposte, poste.com composte ,tmp.effectif effectifPoste,tmp2.effectif effectifEmploi
FROM dtable famille
LEFT OUTER JOIN dtable metier ON famille.id = metier.lien
LEFT OUTER JOIN dtable emploi ON metier.id = emploi.lien
LEFT OUTER JOIN dtable poste ON emploi.id = poste.lien
LEFT OUTER JOIN (
SELECT emploi.id emploiid, count(*) effectif
FROM dtable famille, dtable metier, dtable emploi, pers_v volet_personne
WHERE famille.nom_table = 'NOMGPE0'
AND famille.id = metier.lien
AND metier.id = emploi.lien
AND emploi.id = volet_personne.id_table
AND famille.des like 'i%' GROUP BY emploi.id) tmp2
ON tmp2.emploiid = emploi.id
LEFT OUTER JOIN ( SELECT poste.id posteid, count(*) effectif
FROM dtable famille, dtable metier, dtable emploi, dtable poste, pers_v volet_personne
WHERE famille.nom_table = 'NOMGPE0' AND famille.id = metier.lien
AND metier.id = emploi.lien AND emploi.id = poste.lien
AND poste.id = volet_personne.id_table
AND famille.des like 'i%' GROUP BY poste.id ) tmp
ON tmp.posteid = poste.id
WHERE famille.nom_table = 'NOMGPE0'
AND famille.des like 'i%'
ORDER BY famille.des, metier.des, emploi.des, poste.des
j'ai alors réalisé celle ci:
SELECT famille.id idfamille, famille.code codefamille, famille.des desfamille, famille.com comfamille,
metier.id idmetier, metier.code codemetier, metier.des desmetier, metier.com commetier, emploi.id idemploi,
emploi.code codeemploi, emploi.des desemploi, emploi.com comemploi, poste.id idposte, poste.code codeposte,
poste.des desposte, poste.com composte ,tmp.effectif effectifPoste,tmp2.effectif effectifEmploi
FROM dtable famille,dtable metier,dtable emploi,dtable poste,
( SELECT emploi.id emploiid, count(*) effectif
FROM dtable famille, dtable metier, dtable emploi, pers_v volet_personne
WHERE famille.nom_table = 'NOMGPE0'
AND famille.id = metier.lien
AND metier.id = emploi.lien
AND emploi.id = volet_personne.id_table
AND famille.des like 'i%' GROUP BY emploi.id) tmp2,
( SELECT poste.id posteid, count(*) effectif
FROM dtable famille, dtable metier, dtable emploi, dtable poste, pers_v volet_personne
WHERE famille.nom_table = 'NOMGPE0' AND famille.id = metier.lien
AND metier.id = emploi.lien AND emploi.id = poste.lien
AND poste.id = volet_personne.id_table
AND famille.des like 'i%' GROUP BY poste.id ) tmp
WHERE famille.id = metier.lien (+)
AND metier.id = emploi.lien (+)
AND emploi.id = poste.lien (+)
AND tmp2.emploiid = emploi.id (+)
AND tmp.posteid = poste.id (+)
AND famille.nom_table = 'NOMGPE0'
AND famille.des like 'i%'
ORDER BY famille.des, metier.des, emploi.des, poste.des
mais elle est fausse. (
merci d'avance
---------------
L'été il fait bo