Requete sql sur 2 tables | Requetes imbriqués | Sous requete dans un while
beetsy
Messages postés42Date d'inscriptionlundi 15 septembre 2003StatutMembreDernière intervention19 juillet 2010
-
18 avril 2010 à 17:40
beetsy
Messages postés42Date d'inscriptionlundi 15 septembre 2003StatutMembreDernière intervention19 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 !
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
KrocLeBo
Messages postés18Date d'inscriptionjeudi 7 juin 2001StatutMembreDernière intervention19 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
beetsy
Messages postés42Date d'inscriptionlundi 15 septembre 2003StatutMembreDernière intervention19 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
}
KrocLeBo
Messages postés18Date d'inscriptionjeudi 7 juin 2001StatutMembreDernière intervention19 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.
beetsy
Messages postés42Date d'inscriptionlundi 15 septembre 2003StatutMembreDernière intervention19 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Mike490
Messages postés25Date d'inscriptionjeudi 2 juillet 2009StatutMembreDernière intervention29 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.