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

beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010 - 18 avril 2010 à 17:40
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010 - 23 avril 2010 à 16:22
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

KrocLeBo Messages postés 18 Date d'inscription jeudi 7 juin 2001 Statut Membre Dernière intervention 19 avril 2010
19 avril 2010 à 08:35
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 :)
0
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010
19 avril 2010 à 11:48
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 !
0
KrocLeBo Messages postés 18 Date d'inscription jeudi 7 juin 2001 Statut Membre Dernière intervention 19 avril 2010
19 avril 2010 à 16:59
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.
0
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010
20 avril 2010 à 11:01
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010
22 avril 2010 à 09:14
Up !

Biti

Sà tràiasca tara mea !
0
Mike490 Messages postés 25 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 29 octobre 2010
23 avril 2010 à 15:42
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.
0
beetsy Messages postés 42 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 juillet 2010
23 avril 2010 à 16:22
Merci bcp

C'est ce que je voulais savoir.
0
Rejoignez-nous