begin process at 2010 03 13 22:27:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

SQL Server, MSDE, SQL Express

 > 

Requêtes

 > 

Boucler sur deux tables


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Boucler sur deux tables

vendredi 10 avril 2009 à 11:59:35 | Boucler sur deux tables

XtazyMushroom

Bonjour j'ai un petit probleme pour executer une boucle sur deux tables. Je m'explique J'ai une table 1 et une table 2: Table 1 id(char) valeur 334345 0 336456 0 325645 0 Et une table 2 id valeur 3256 8 336 5 33 4 Donc je voudrai recuperer la valeur id de la table 1 et la tester avec les valeurs de la table 2. Donc faire une boucle sur les 3 premiers chiffre. Je voulais faire donc une soustraction de chaine donc enlever les x valeurs de fin pour recuperer les 4 (taille max des id de ma table 2) premiers chiffres. Tester les 4 premiers chiffres si ils correspondent a une valeur de la table 2 affecter la variable dans la table 1, sinon decrementer et tester avec les 3 (taille max - 1) et ainsi de suite jusqu'a deux... Mais quelques problemes avec ma boucle while! Quelqu'un aurait une idee?
vendredi 10 avril 2009 à 12:03:44 | Re : Boucler sur deux tables

XtazyMushroom

Bonjour j'ai un petit probleme pour executer une boucle sur deux tables. Je m'explique J'ai une table 1 et une table 2:
Table 1
id(char) valeur
334345      0
336456      0
325645      0
Et une table 2
id   valeur
3256    8
336      5
33       4

Donc je voudrai recuperer la valeur id de la table 1 et la tester avec les valeurs de la table 2. Donc faire une boucle sur les 3 premiers chiffre. Je voulais faire donc une soustraction de chaine donc enlever les x valeurs de fin pour recuperer les 4 (taille max des id de ma table 2) premiers chiffres.

Tester les 4 premiers chiffres si ils correspondent a une valeur de la table 2 affecter la variable dans la table 1, sinon decrementer et tester avec les 3 (taille max - 1) et ainsi de suite jusqu'a deux... Mais quelques problemes avec ma boucle while! Quelqu'un aurait une idee?
vendredi 10 avril 2009 à 14:21:09 | Re : Boucler sur deux tables

crn_c21

Donne nous une idée de ce que tuas fait ce sera plus simple ainsi que le type des données de tes 2 tables
mardi 14 avril 2009 à 08:50:09 | Re : Boucler sur deux tables

XtazyMushroom

Grossomodo j'ai deux tables:

Table 1:test
id(char(80)) valeur(INT)
334345           0
336456           0
325645           0

Et une table 2:prefix
id(char(80))   valeur(INT)
3256              8
336               5
33                4

Avec un curseur je veux parcourir chaque ligne de la table 1. Pour chaque ligne recuperer les 4 premiers chiffres. Ensuite si ces 4 premiers chiffre formant le nombre X est un champs de table 2 je met la valeur de X de la table 2 dans la table 1.

Pour le moment j'ai ca: Mais mon curseur passe bien de ligne en ligne mais je n'arrive pas a interpreter les valeurs des champs de la ligne de la table1. La boucle while je lai teste sur une autre table...

delimiter |
DROP PROCEDURE IF EXISTS prefixe;
CREATE PROCEDURE prefixe()
BEGIN

DECLARE num, tronc CHAR(80) DEFAULT '';
DECLARE i INT DEFAULT 4;
DECLARE done, x INT DEFAULT 0;
DECLARE CPT_ID INT;
DECLARE curs CURSOR FOR SELECT dst FROM test WHERE cout IS NULL;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN curs;

REPEAT
FETCH curs INTO CPT_ID;
IF NOT done THEN
ins_while:WHILE i > 2 DO

SET tronc = (SELECT LEFT(CPT_ID,i)); -- ICI EST MON ERREUR CPT_ID = reference mais pas valeur du champs...

SELECT count(*) INTO x
FROM prefixe WHERE dst LIKE tronc; -- DONC NE RENTRE JAMAIS LA :(

IF (x = 0) THEN
SET i = i - 1;
ELSE
UPDATE test SET cout=7777 WHERE dst=num;
LEAVE ins_while;
END IF;

END WHILE;
END IF;
UNTIL done END REPEAT;

CLOSE curs;
END|

Si quelqu'un a une idee SVP
mardi 14 avril 2009 à 09:06:00 | Re : Boucler sur deux tables

XtazyMushroom

Ah oui et j'ai deja teste le DECLARE CPT_ID CHAR(80)
mardi 14 avril 2009 à 09:58:29 | Re : Boucler sur deux tables

XtazyMushroom

indete excusez moi:

delimiter |
DROP PROCEDURE IF EXISTS prefixe;
CREATE PROCEDURE prefixe()
BEGIN

DECLARE num, tronc CHAR(80) DEFAULT '';
DECLARE i INT DEFAULT 9;
DECLARE done, x INT DEFAULT 0;
DECLARE CPT_ID INT;
DECLARE curs CURSOR FOR SELECT dst FROM test;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN curs;

REPEAT
        FETCH curs INTO CPT_ID;
        IF NOT done THEN
                ins_while:WHILE i > 2 DO
                        SET tronc = (SELECT LEFT(CPT_ID,i));
                        INSERT INTO test (dst, cout) VALUES (dst,i);

                        SELECT count(*) INTO x
                        FROM prefixe WHERE dst LIKE tronc;

                        IF (x = 0) THEN
                                SET i = i - 1;
                        ELSE
                                UPDATE test SET cout=7777 WHERE dst=num;
                                LEAVE ins_while;
                        END IF;

                END WHILE;
        END IF;
UNTIL done END REPEAT;

CLOSE curs;
END|
mardi 14 avril 2009 à 09:59:49 | Re : Boucler sur deux tables

aieeeuuuuu

bonjour

pourquoi ne pas faire ça juste en une requête, plutôt que de passer par un curseur ?

UPDATE Table1 T1
SET Valeur = COALESCE(
    SELECT Valeur From Table2 WHERE T2 WHERE T2.id = (LEFT(T1.id, 4),
    SELECT Valeur From Table2 WHERE T2 WHERE T2.id = (LEFT(T1.id, 3),
    SELECT Valeur From Table2 WHERE T2 WHERE T2.id = (LEFT(T1.id, 2),
    T1.Valeur
)


mardi 14 avril 2009 à 10:04:22 | Re : Boucler sur deux tables

XtazyMushroom

Par exemple:
Si on a 00336 on a un prefixe valide donc on a un prix par appel (un cout)
Si on a un 0033 c'est un prix inferieur

Si je fais cette requete il va d'abord appliquer un cout pour 00336 puis appliquer un cout pour 0033
mardi 14 avril 2009 à 12:02:24 | Re : Boucler sur deux tables

aieeeuuuuu

Re,

non, avec ma méthode il ne devrait pas faire ca, ou alors je me suis trompé.

il devrait prendre le premiere resultat non NULL trouvé (fonction coalesce)

as-tu essayé ?

mardi 14 avril 2009 à 12:25:31 | Re : Boucler sur deux tables

XtazyMushroom

Ok merci j'ai teste avec ca:
CREATE TABLE test (
dst varchar(80) NOT NULL default '',
duration int(11) NOT NULL default '0',
cout int(11) NULL);

INSERT INTO test (dst, duration) VALUES ('0033668711311', 12);
INSERT INTO test (dst, duration) VALUES ('0033666724269', 32);
INSERT INTO test (dst, duration, cout) VALUES ('0033666724269', 32, 5);
INSERT INTO test (dst, duration) VALUES ('0033466724269', 32);

-----------------

CREATE TABLE prefixe (
dst varchar(80) NOT NULL default '',
cout int(11) NOT NULL default '0');

INSERT INTO prefixe (dst, cout) VALUES ('00336', 10);
INSERT INTO prefixe (dst, cout) VALUES ('0033', 5);

------------------

qui me donne ca

+---------------+----------+------+
| dst           | duration | cout |
+---------------+----------+------+
| 0033668711311 |       12 | NULL |
| 0033666724269 |       32 | NULL |
| 0033666724269 |       32 |    5 |
| 0033466724269 |       32 | NULL |
+---------------+----------+------+

et

+-------+------+
| dst   | cout |
+-------+------+
| 00336 |   10 |
| 0033  |    5 |
+-------+------+

-----------------

Et t'as requete:
UPDATE TABLE test
SET cout = COALESCE(
    SELECT cout From prefixe WHERE prefixe.dst = (LEFT(test.dst, 4)),
    SELECT cout From prefixe WHERE prefixe.dst = (LEFT(test.dst, 3)),
    test.cout
)

donne ca:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE test
SET cout = COALESCE(
    SELECT cout From prefixe WHERE prefixe.dst =' at line 1


:D :D :D :D

Je regarde ou est mon erreur mais un peu fatigue si jamais ca te saute aux yeux! ;)

1 2

Cette discussion est classée dans : boucle, table, valeur, id, tables


Répondre à ce message

Sujets en rapport avec ce message

Dépendance de tables SQL [ par toutgreg ] Bonjour, Je suis entrain de faire l'architecture de ma base SQL et je bloque sur une dépendance de table. Pour résumer, j'ai 3 tables et je cherche à Choix de valeur par défault n+1 [ par Billybobbonnet ] Bonjour à tous!Premier message sur ce forum et je vous salue tous à cette occasion.J'ai une BDD mySQL dans laquelle j'ai une table qui répertorie des Requête qui boucle sur elle même [ par spyro666 ] Bonjour, j'aurais besoin d'une information : Comment puis-je faire une requête qui boucle sur elle même avec mysql4 ? Est au moins possible ou faut-il Inserer des données [ par JALEO WAHRANI ] Bonjour à tous,je souhaiterais inserer des données dans 2 tables à la fois.On a d'un côté la table     t_personnes(id, nom, prenom, no_insee)et de l'a Besoin d'aide avecUPDATE et BOUCLE [ par johann36 ] Bonjour,J'ai un gros soucis et je bloque dessus depuis ce matin sans trouver la réponse.J'essaie de faire une boucle avec une requête UPDATE, je m'exp MySQL jonction/fusion/union vers une table tierce [ par pcerne ] Bonjour, Petit schéma explicatif : J'ai une table A id int nom_id char(30) prenom_id char(30) une table B id DEFINIR UNE CONTRAINTE D'UNICITE [ par issousam ] Bonjour,Je m'adresse à vous car je debute en langage SQL et j'ai un probleme au niveau des contarintes d'unicité que je veux definir au sein des table Conception de BDD: relation n-n [ par leica69 ] Bonjour, je souhaiterais concevoir une BDD mais avant d'attaquer j'aurais une question à vous poser. En simplifiant, voici ma situation: Je veux mettr Comparaison [ par romainbisson ] Salut,Je souhaite comparer deux tables A et B ou le champ C existe dans les deux tables, mais je veux que C soit aboslument egal dans  les deux tables Récupérer l'id d'une requête et utiliser cette valeur dans une autre requête [ par therainbow3 ] Bonjour, Je suis entrain de concevoir un programme en C# où je dois créer des requêtes SQL suivant les données du client qui seront par la suite pouss


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,374 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales