bonjour,
Au secours, je suis malade.
Je pense que j'ai de la fièvre. Je suis désolé pour ce message plutôt ... hummm... d'amateur mais je n'arrive pas à resoudre une requête SQL qu'à travers un solution ... hum... disons tiré par les cheveux.
L'idée est de remplacer la valeur ID_SOCIETE de ma table temporaire TMP_CLAUDIO par la valeur de la table de référence TMP_REF_CLAUDIO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CREATE TABLE TMP_CLAUDIO (ID_SOCIETE VARCHAR2(4), ID_SITE VARCHAR2(4)); INSERT INTO TMP_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocA','SitX'); CREATE TABLE TMP_REF_CLAUDIO (ID_SOCIETE VARCHAR2(4), ID_SITE VARCHAR2(4)); INSERT INTO TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocB','SitX');
Je peux facilement faire ça avec le code suivant
Mais ça se complique DIABLEMENT si j'ai une table de référence pourrie:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 UPDATE TMP_CLAUDIO upd SET ID_SOCIETE = (SELECT distinct rfr.ID_SOCIETE FROM TMP_REF_CLAUDIO rfr WHERE upd.ID_SITE = rfr.ID_SITE AND upd.ID_SOCIETE != rfr.ID_SOCIETE) WHERE EXISTS (SELECT 1 FROM TMP_REF_CLAUDIO RFR WHERE RFR.ID_SITE = upd.ID_SITE AND rfr.ID_SOCIETE != upd.ID_SOCIETE)
Pour le même site 'SiteX' j'ai 3 sociétés SocC (3 fois) SocB (2 fois) socA(1 fois)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 INSERT INTO TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocA','SitX'); INSERT INTO TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocB','SitX'); INSERT INTO TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocC','SitX'); INSERT INTO TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocC','SitX'); INSERT INTO TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocC','SitX');
J'ai essayé la chose suivante, mais je n'arrive pas trouvé ce qui cloche dans ma requête. Il semble que la référence 'upd' à la table TMP_CLAUDIO se marche pas parce que j'ai 2 select imbriqués.
Il faudrait donc que je trouve une requête qui me renvoit 'SocC' dans un seul select.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 UPDATE TMP_CLAUDIO upd SET ID_SOCIETE = (SELECT ID_SOCIETE FROM (SELECT rfr.ID_SOCIETE, count(*) FROM TMP_REF_CLAUDIO rfr WHERE upd.ID_SITE = rfr.ID_SITE AND upd.ID_SOCIETE != rfr.ID_SOCIETE GROUP BY rfr.ID_SOCIETE ORDER BY 2 DESC) WHERE ROWNUM = 1) WHERE EXISTS (SELECT 1 FROM TMP_REF_CLAUDIO RFR WHERE RFR.ID_SITE = upd.ID_SITE AND rfr.ID_SOCIETE != upd.ID_SOCIETE)
J'espère avoir été clair (????)![]()
Claudio
Partager