Requete sql sur 2 tables | Requetes imbriqués | Sous requete dans un while

Signaler
Messages postés
42
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
19 juillet 2010
-
Messages postés
42
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
19 juillet 2010
-
salut tout le monde

Débutant en base de donnée, j'aurai besoin de vos lumières !

Voici mon soucis :

J'ai 2 tables amis et villes

Table AMIS :
------------
id, nom, villeid
1 - Bertrand - 1
2 - Sophie - 2

Table VILLES :
--------------
id,nom
1 - Paris
2 - Lyon

donc en français :
Bertrand habite Paris et Sophie Lyon

ma question est comment fait-on dans une requete du type :
select * from amis
dans le while qui va m'afficher mes amis avec les villes dans lesquelles ils habitent
while (reader.Read())
{
//ici faire une autre requete qui est :
//select nom from villes where id=reader["villeid"]
}

Voila, la première requete, pas de soucis, mais je n'arrive pas a faire une 2e requete avec une autre commande.CommandText

Ca me dit : DataReader already active on this command

merci beaucoup pour votre aide !
A voir également:

7 réponses

Messages postés
18
Date d'inscription
jeudi 7 juin 2001
Statut
Membre
Dernière intervention
19 avril 2010

Le plus simple c'est de tout faire en, un seul statement en faisant une jointure sur les tables.

Voici un petit exemple qui prend en charge la génération de phrase en prime

SELECT
a.*, v.nom, a.nom + ' habite ' + v.nom as phrase
FROM amis a
INNER JOIN villes v on a.villeid = v.id

et un autre qui gère également les cas ou villeid n'est pas renseigné dans la table amis (LEFT JOIN au lieu de INNER JOIN et gestion des cas ou la ville est null dans le résultat)

SELECT
a.*, v.nom, a.nom + ' habite ' + ISNULL(v.nom, 'quelque part') as phrase
FROM amis a
LEFT JOIN villes v on a.villeid = v.id

Si ça peut t'aider :)
Messages postés
42
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Hello KrocLeBo,

Merci beaucoup, je n'ai pas essayé de faire de jointures.

Je poursuis ma question pour les requêtes imbriquées : est-ce possible en .net ?

genre :

select * from amis
while Readerami.read()
{
select cp from villes where id= readerami["villeid"].value
//puis ensuite faire un update de la table amis en rajoutant le cp dans le champ cp
update ami set cp=readerville["cp"].value where id=readerami["id"].value
}

et si oui comment :D ?

J'ai beau cherché sur internet je trouve pas...

merci beaucoup !
Messages postés
18
Date d'inscription
jeudi 7 juin 2001
Statut
Membre
Dernière intervention
19 avril 2010

Perso pour l'update je le ferais aussi directement en SQL avec une jointure :)

UPDATE a SET a.cp = v.cp
FROM amis a
INNER JOIN villes v ON v.id = a.villeid

Sinon oui c'est tout à fait possible de parcourir une requete et d'appeler ensuite des sous-requete, mais ce n'est pas forcément une bonne chose coté performances.
Cela multiplie les échanges entre la BDD et l'appli.
Messages postés
42
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
19 juillet 2010

hello

je viens du monde php / mysql et en mysql ce sont les inner join qui sont moins performantes car ils consomment beaucoup de ressources notamment sur un site qui a beaucoup de trafic.

Aurais-tu un exemple de code c# de sous requête lorsque tu parcours une première requête ?

Merci beaucoup
Messages postés
42
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Up !

Biti

Sà tràiasca tara mea !
Messages postés
25
Date d'inscription
jeudi 2 juillet 2009
Statut
Membre
Dernière intervention
29 octobre 2010

Salut Beetsy

Tu ne peux pas executer une autre requete tant que tu as 1 datareader d'ouvert.
Moi je stockerai le resultat de la 1ere requete dans un tableau, puis lance ta 2eme requete avec les valeurs tu tableau.
Messages postés
42
Date d'inscription
lundi 15 septembre 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Merci bcp

C'est ce que je voulais savoir.