Récupérer 2 valeurs et + avec deux tables(SQL Server)

Récupérer 2 valeurs et + avec deux tables(SQL Server) - SQL/NoSQL - Programmation

Marsh Posté le 10-03-2009 à 09:04:58    

Bonjour à tous,
 
Je vous expose mon souci.Je cherche à appliquer la méthode ci-dessous afin de récupérer certaines valeurs
 

Code :
  1. SELECT "nom de colonne"
  2. FROM "nom de table"
  3. WHERE "nom de colonne" IN ('valeur1', 'valeur2', ...)


 
La structure est la suivante:
Table1
Colonne1
Valeur 1
Valeur 2
.........
 
 
Table 2
Colonne A
 
Si j'apllique de façon brute la méthode plus haut de la façon suivante:

Code :
  1. select distinct colonne1
  2. from table1 where colonne1  in(select distinct colonne1 from table1 a,table2 b d where id table1=id table2 and colonneA='valeur1',’valeur2’)
  3. order by colonne1


 
j'ai un message d'erreur de syntaxe à ce niveau: ','
 
Si je lance la requête suivante par contre, je n'ai aucun problème:

Code :
  1. select distinct colonne1
  2. from table1 where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and colonneA='valeur1')
  3. where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and colonneA='valeur2')
  4. order by colonne1


 
 
Autrement dit, il faut que je mette autant de lignes, que de valeurs à récupérer!.Merci de dire comment procéder.
 
Bonne journée.
 

Reply

Marsh Posté le 10-03-2009 à 09:04:58   

Reply

Marsh Posté le 10-03-2009 à 15:34:03    

soit tu fais un IN(SELECT) soit des IN(val1,val2)


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 11-03-2009 à 08:00:01    

fluminis a écrit :

soit tu fais un IN(SELECT) soit des IN(val1,val2)


 
Merci mais je bloque.

Reply

Marsh Posté le 31-03-2009 à 11:06:02    

Salut TAM136
 
J'ai pas sql server sous la main, mais ca devrait ressembler a ca...
 
SELECT DISTINCT Colonne1
FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.Id
WHERE Table1.Colonne1 In ("valeur1","valeur2" )
ORDER BY Table1.Colonne1


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 01-04-2009 à 08:09:27    

SuppotDeSaTante a écrit :

Salut TAM136
 
J'ai pas sql server sous la main, mais ca devrait ressembler a ca...
 
SELECT DISTINCT Colonne1
FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.Id
WHERE Table1.Colonne1 In ("valeur1","valeur2" )
ORDER BY Table1.Colonne1


 
 
Salut Dje69r
 
Merci de te pencher sur mon problème.Il y a un message d'erreur qui m'indique que valeur1 et valeur2 sont des noms de colonne incorrects.Par ailleurs, à moins de ne pas avoir été assez clair ou de ne pas comprendre la logique de ton code,on n'y voit pas apparaître colonneA ou autrement dit la colonne de Table2.Les valeurs que je veux récupérer se trouvent dans colonneA de Table2.

Reply

Marsh Posté le 01-04-2009 à 09:20:06    

TAM136 a écrit :


Si je lance la requête suivante par contre, je n'ai aucun problème:

Code :
  1. select distinct colonne1
  2. from table1 where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and colonneA='valeur1')
  3. where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and colonneA='valeur2')
  4. order by colonne1


 
 
Autrement dit, il faut que je mette autant de lignes, que de valeurs à récupérer!.Merci de dire comment procéder.
 
Bonne journée.
 


 
Pourquoi tu ne mets pas un OR alors dans ta seconde requete ? (Qui est liée a la premiere par le IN) Puisqu'en fait la, comme tu as 2 IN tu fais le lien avec deux sous requete.
Apres, les IN sont normalement remplacables par des jointures entre les tables et une clause WHERE (Ici tu as un lien entre ta table table1 et table2, puis tu filtres betement sur la valeur de la colonneA)
 
Un truc du genre :  
select distinct colonneA
from table1 where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and (colonneA='valeur1' OR colonneA='valeur2'))
order by colonne1
 
Ou encore :
SELECT DISTINCT ColonneA
FROM Table1 JOIN Table2 ON Table1.Id = Table2.Id  
WHERE Table1.Colonne1 In ('valeur1','valeur2' )  
ORDER BY Table1.Colonne1
 
Le IN ici me permet de ne pas avoir de OR, genre WHERE Table1.Colonne1='Valeur1' OR Table1.Colonne1='Valeur2'

Message cité 2 fois
Message édité par SuppotDeSaTante le 01-04-2009 à 09:21:22

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 01-04-2009 à 14:03:34    

SuppotDeSaTante a écrit :


 
Pourquoi tu ne mets pas un OR alors dans ta seconde requete ? (Qui est liée a la premiere par le IN) Puisqu'en fait la, comme tu as 2 IN tu fais le lien avec deux sous requete.
Apres, les IN sont normalement remplacables par des jointures entre les tables et une clause WHERE (Ici tu as un lien entre ta table table1 et table2, puis tu filtres betement sur la valeur de la colonneA)


 
Ce n'est pas un Or (ou) que je veux mais un And(et).Si je mets Or, la requête fonctionne mais ce n'est pas ce que je veux faire.Si je mets And,il n'y a aucun message d'erreur qui est retourné mais aucun résultat n'apparaît après exécution de la requête
 
 
[quotemsg=1868093,6,310311]
 
Un truc du genre :  
select distinct colonneA
from table1 where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and (colonneA='valeur1' OR colonneA='valeur2'))
order by colonne1
[quotemsg=1868093,6,310311]
 
La requête ne fonctionne pas car dans order by, on doit y retrouver les éléments de la liste de sélection et dans tous les cas,la requête tout comme la mienne ne retourne aucun résultat si je mets bien order by colonneA
 
Enfin l'autre requête ne fonctionne pas non plus.Je regarder ça et te tiens au courant.Visiblement, je ne suis pas assez clair.

Reply

Marsh Posté le 01-04-2009 à 15:28:04    

Bah surtout avec ton exemple en MP je ne vois pas comment un enregistrement peut etre une chaise ET un tabouret...
Donc normal que ca ne renvoit rien. Enfin pour moi avec les infos que j'ai compris.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-04-2009 à 07:47:15    

SuppotDeSaTante a écrit :

Bah surtout avec ton exemple en MP je ne vois pas comment un enregistrement peut etre une chaise ET un tabouret...
Donc normal que ca ne renvoit rien. Enfin pour moi avec les infos que j'ai compris.


 
Ma requête initiale fonctionne: j'ai fait plusieurs tests.En effet,la chaise représente un enregistrement et le tabouret,un autre.Il doit quand mêm exister un code plus joli et surtout moins long et à écrire et à s'exécuter qu'un code avec autant de in(select..) que d'enregistrements.Sinon,tant pis.Il y a truc qui se rapproche de ce que je veux mais le problème est qu'il y a 3 tables et je n'arrive donc pas à m'en rapprocher(page 17: ceux qui ont réservé un bateau rouge et un bateau vert:
www.cs.albany.edu/~ganesh/cpsc304/SQL.pdf  
 

SuppotDeSaTante a écrit :


 
Pourquoi tu ne mets pas un OR alors dans ta seconde requete ? (Qui est liée a la premiere par le IN) Puisqu'en fait la, comme tu as 2 IN tu fais le lien avec deux sous requete.
 
Apres, les IN sont normalement remplacables par des jointures entre les tables et une clause WHERE (Ici tu as un lien entre ta table table1 et table2, puis tu filtres betement sur la valeur de la colonneA)
 
 


 
En fait  le 1er in n’a aucun intérêt. La requête devient ainsi:
 

Code :
  1. select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and colonneA='valeur1'
  2. where colonne1  in(select distinct colonne1 from table1 a,table2 b  where id table1=id table2 and colonneA='valeur2')
  3. order by colonne1


 
 
Le fait qu’il y ait un ou deux in n’a, je pense, aucune incidence, puisque la jointure est faite au niveau suivant:
 
id table1=id table2
 
J’avoue ne pas trop comprendre ce paragraphe et encore moins le rapport entre la jointure et le filtre car encore une fois pour rappel, je veux filtrer sur au moins deux valeurs (valeur 1 et valeur 2 et non pas valeur 1 ou valeur 2).
[/quote]

Reply

Marsh Posté le 02-04-2009 à 10:07:07    

Oui je comprends bien, mais plusieurs IN comme tu les mets correspondent a un une clause WHERE avec des OR
 
En gros tu veux tous les enregistrements, id table1=id table2 ET (colonneA='valeur2' OU colonneA='valeur1' ou colonneA='valeur3')
 
Si tu mets un AND par exemple, c'est impossible a retourner, tu ne peux pas avoir un AND sur ce genre de valeur, car comme dit precedement un enregistrement ne peut pas etre a la fois une chaise ET un tabouret, c'est donc forcement un OR.  
En gros : Tu veux Chaise OU tabouret, seulement si id table1=id table2
 
De plus je ne vois pas du tout l'interet du IN, vu que le IN permet de filtrer une requete en fonction d'une autre requete.  
Mais la toi, tu as les memes tables dans chaques requetes, et qui plus est ces tables peuvent etre liées par un simple JOIN, ce qui fait que le id table1=id table2 devient superflu dans chaque IN


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-04-2009 à 10:07:07   

Reply

Marsh Posté le 02-04-2009 à 12:26:12    

SuppotDeSaTante a écrit :

Oui je comprends bien, mais plusieurs IN comme tu les mets correspondent a un une clause WHERE avec des OR
 
En gros tu veux tous les enregistrements, [b]Où id table1=id table2 ET (colonneA='valeur2' OU colonneA='valeur1' ou colonneA='valeur3')[/b]
 


 
Non, ce que je veux,c'est colonne A='valeur1' ET et colonne A='valeur2' ET colonne A='valeur3' ET ....
 
Dans ma requête,c'est bien le cas.Elle ne correspond à un OR!Si j'enlève id table1=id table2, la requête ne me retourne aucun résultat.
 

Reply

Marsh Posté le 02-04-2009 à 12:50:44    

Est-ce que tu peux nous donner un exemple plus précis avec :
- Les tables
- Le contenu des tables
- Ce que tu veux avoir
En faisant attention à ne pas donner un "cas limite"  (donc, en donnant suffisamment de contenu pour qu'on voie ce que tu veux et surtout ce que tu ne veux pas récupérer) ?
 
Parce que là, j'ai franchement du mal à comprendre la logique de ce que tu veux...

Reply

Marsh Posté le 02-04-2009 à 14:03:53    

Désolé TAM136, je vais aussi attendre d'avoir un peu plus d'elements sur le contenu, car  
colonne A='valeur1' ET et colonne A='valeur2' ET colonne A='valeur3' ET ....
Je ne vois pas comment ca peut etre possible, enfin si valeur1 est different de valeur2


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-04-2009 à 15:05:37    

SuppotDeSaTante a écrit :

Désolé TAM136, je vais aussi attendre d'avoir un peu plus d'elements sur le contenu, car  
colonne A='valeur1' ET et colonne A='valeur2' ET colonne A='valeur3' ET ....
Je ne vois pas comment ca peut etre possible, enfin si valeur1 est different de valeur2


 
Evidemment que valeur1 est différent de valeur2: valeur1=tabouret par exemple et valeur 2=chaise.

Reply

Marsh Posté le 02-04-2009 à 15:15:44    

Et bien alors, pour moi, c'est impossible qu'un enregistrement puisse etre egale à tabouret ET chaise. C'est un SELECT DISTINCT et un OR.
 
Prends une liste d'un tableau Excel. Avec dedans :
Tabouret
Chaise
Chaise
Chaise
Tabouret
 
Si tu veux que tabouret et chaise n'apparaissent qu'une fois, c'est forcément un OR et un SELECT DISCTINCT.
Une cellule ne contient pas ET Chaise ET Tabouret, c'est impossible et inconcevable.
 
PS : et t'arrete de t'ennerver hein :p
 
 
edit : Je viens d'aller voir ton exemple page 17. Relis bien cette phrase sur le 2nd exemple : Replacing OR in the previous query with AND will try to retrieve boats that are both red and green in color and will always return an empty answer
Si tu dis que B1 = red AND B1 = green ca revoit rien car c'est impossible. Donc idem que pour des tabourets et des chaises.
Parcontre dans le second exemple, c'est B1 AND B2 mais ca peut pas etre B1 AND B1...
 
D'ailleurs comme dit plus haut, tes WHERE...IN a la suite, c'est exactement pareil qu'un WHERE.... OR....
 
Apres c'est un abus de langage, en Francais, comme souvent, on va dire "je veux les tabourets et les chaises, et qu'ils n'apparaissent qu'une fois", alors que c'est "ou" qu'il faudrait dire, etant donné qu'un enregistrement (ou une cellule) ne contient qu'une information et une seule (sur un champ donné), le ET a donc ici aucun sens.
/edit

Message cité 1 fois
Message édité par SuppotDeSaTante le 02-04-2009 à 15:28:37

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-04-2009 à 16:07:25    

J'attends l'exemple que je tai demandé, mais pour le moment :

TAM136 a écrit :

Non, ce que je veux,c'est colonne A='valeur1' ET et colonne A='valeur2' ET colonne A='valeur3' ET ....

TAM136 a écrit :

Evidemment que valeur1 est différent de valeur2: valeur1=tabouret par exemple et valeur 2=chaise.

Tu ne récupères forcément rien, puisque :

colonne A='valeur1' ET colonne A='valeur2' ET valeur1 est différent de valeur2
=> colonne A est différent de colonne A

:pt1cable:

Reply

Marsh Posté le 03-04-2009 à 07:41:37    

SuppotDeSaTante a écrit :

Et bien alors, pour moi, c'est impossible qu'un enregistrement puisse etre egale à tabouret ET chaise. C'est un SELECT DISTINCT et un OR.
Prends une liste d'un tableau Excel. Avec dedans :
 
Tabouret
Chaise
Chaise
Chaise
Tabouret  
 
Si tu veux que tabouret et chaise n'apparaissent qu'une fois, c'est forcément un OR et un SELECT DISCTINCT.
Une cellule ne contient pas ET Chaise ET Tabouret, c'est impossible et inconcevable.
PS : et t'arrete de t'ennerver hein :p  
 
edit : Je viens d'aller voir ton exemple page 17. Relis bien cette phrase sur le 2nd exemple : Replacing OR in the previous query with AND will try to retrieve boats that are both red and green in color and will always return an empty answer
Si tu dis que B1 = red AND B1 = green ca revoit rien car c'est impossible. Donc idem que pour des tabourets et des chaises.
Parcontre dans le second exemple, c'est B1 AND B2 mais ca peut pas etre B1 AND B1...  
 
D'ailleurs comme dit plus haut, tes WHERE...IN a la suite, c'est exactement pareil qu'un WHERE.... OR....  
 
Apres c'est un abus de langage, en Francais, comme souvent, on va dire "je veux les tabourets et les chaises, et qu'ils n'apparaissent qu'une fois", alors que c'est "ou" qu'il faudrait dire, etant donné qu'un enregistrement (ou une cellule) ne contient qu'une information et une seule (sur un champ donné), le ET a donc ici aucun sens.
/edit

 
 

macgawel a écrit :

J'attends l'exemple que je tai demandé, mais pour le moment :


macgawel a écrit :

Tu ne récupères forcément rien, puisque :
 

colonne A='valeur1' ET colonne A='valeur2' ET valeur1 est différent de valeur2
=> colonne A est différent de colonne A

:pt1cable:

 
 
Bon, je me calme. Désolé dje. Ne le prends pas mal non plus. Je commence à comprendre mon raisonnement et en particulier mon erreur sur colonne A=valeur1=valeur2 avec valeur1<>valeur1. Je me rends compte effectivement que je me suis bien déchiré sur ce coup là!
 
Néanmoins, je vous explique la cause de cette erreur avec l’exemple suivant:
 
Table1                                  Table2
 
Colonne 1                           ColonneA
 
Salle1                                   Lit
 
Salle1                                   Tabouret
 
Salle1                                   Séchoir
 
Salle1                                   Placard
 
Salle2                                   Lit
 
Salle2                                   Pendule
 
 
 
Ce que je veux, c’est la salle qui contient un lit ET un tabouret, autrement dit la salle1 et non pas la salle qui contient un lit ou un tabouret, parce que sinon, je me retrouve avec les 2 salles puisque chacune contient un lit.
 
C’est cette histoire de Or qui m’a perturbé d’autant plus que dans le lien que j’aurais du effectivement mieux lire, les 2 solutions pour contourner cet écueil n’intègrent pas de Or!
 
Par contre, visiblement, il y a bien des lignes supplémentaires de code quand le nombre de critères de sélection augmente:
 
 

Code :
  1. SELECT S.sname
  2. FROM Sailors S, Reserves R, Boats B,
  3. WHERE S.sid = R.sid AND R.bid = B.bid AND B.color = ’Red’
  4. /*1er critère=Red*/
  5. UNION
  6. SELECT S2.sname
  7. FROM Sailors S2, Reserves R2, Boats B2,
  8. WHERE S2.sid = R2.sid AND R2.bid = B2.bid AND B2.color = ’Green’
  9. /*2nd critère=Green*/
  10. /*4 lignes de code de plus, si on inclut Union*/


 
Edit: je viens de tester avec union et la requête me retourne les 2 salles: visiblement union =+ ici.
Pour rappel, ma première requête fonctionne bien.J'ai bien l'impression que je vais devoir continuer avec ça.
 

Message cité 1 fois
Message édité par TAM136 le 03-04-2009 à 08:12:22
Reply

Marsh Posté le 03-04-2009 à 10:23:36    

Ok la je pige mieux.
 
La jonction entre tes tables se fait comment ? Liaison de Table1 à Table2 ou tu as une table associative ?
 
C'est genant de passer par deux requetes ?
 
Sinon tu peux aussi compter le nombre d'occurence trouver (ici Salle1 : 2 et Salle2 : 1) tu tries pas ordre decroissant et tu prends le premier, ou le max

Message cité 1 fois
Message édité par SuppotDeSaTante le 03-04-2009 à 10:56:29

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 03-04-2009 à 10:52:51    

TAM136 a écrit :

Table1                                  Table2
 
Colonne 1                           ColonneA
Salle1                                   Lit
Salle1                                   Tabouret
Salle1                                   Séchoir
Salle1                                   Placard
Salle2                                   Lit
Salle2                                   Pendule
 
Ce que je veux, c’est la salle qui contient un lit ET un tabouret, autrement dit la salle1 et non pas la salle qui contient un lit ou un tabouret, parce que sinon, je me retrouve avec les 2 salles puisque chacune contient un lit.

Vu comment tu présentes les tables, il n'y a aucun lien entre les deux tables.
En fait, vu comment tu présentes les tables, ce n'est pas une Base de données Relationnelle. Et si elle n'est pas relationnelle, faire du SQL dessus c'est difficile  :pt1cable:  
 
Pour faire du relationnel :

Table1 = TableSalles (IdSalle, NomSalle, <autres informations sur les salles> )
(1, "Salle1", ...
 2, "Salle2", ...)

Table2 = TableMeubles (IdMeuble, NomMeuble, <autres informations sur les meubles> )
(1, "Lit", ...
 2, "Tabouret", ...)

Vu ce que tu veux faire, il y a une liaison entre les deux tables.
Pour trouver laquelle, et comment la matérialiser, il "suffit" d'étudier la cardinalité. Mais là, c'est de la conception de BDD, et si tu ne sais pas le faire il va falloir apprendre  :hello:

Reply

Marsh Posté le 03-04-2009 à 12:38:00    

macgawel a écrit :

Vu comment tu présentes les tables, il n'y a aucun lien entre les deux tables.
En fait, vu comment tu présentes les tables, ce n'est pas une Base de données Relationnelle. Et si elle n'est pas relationnelle, faire du SQL dessus c'est difficile  :pt1cable:  
 
Pour faire du relationnel :

Table1 = TableSalles (IdSalle, NomSalle, <autres informations sur les salles> )
(1, "Salle1", ...
 2, "Salle2", ...)

Table2 = TableMeubles (IdMeuble, NomMeuble, <autres informations sur les meubles> )
(1, "Lit", ...
 2, "Tabouret", ...)

Vu ce que tu veux faire, il y a une liaison entre les deux tables.
Pour trouver laquelle, et comment la matérialiser, il "suffit" d'étudier la cardinalité. Mais là, c'est de la conception de BDD, et si tu ne sais pas le faire il va falloir apprendre  :hello:  


 
La liaison existe.Je ne comprends pas ce que tu me dis.Les tables sont reliées par une clé sinon ma requête ne fonctionnerait pas.Si tu relis mon post depuis le début, tu verras que je parle de id Tbale 1 et id Table 2

Message cité 1 fois
Message édité par TAM136 le 03-04-2009 à 12:38:49
Reply

Marsh Posté le 03-04-2009 à 12:53:10    

TAM136 a écrit :

La liaison existe.Je ne comprends pas ce que tu me dis.Les tables sont reliées par une clé sinon ma requête ne fonctionnerait pas.Si tu relis mon post depuis le début, tu verras que je parle de id Tbale 1 et id Table 2

Les tables sopnt peut-être reliées par une clé, mais pour le voir, il faudrait avoir le détail des tables.
 
Et quelle est le rapport entre id_table1 et id_table2 ?
Quelle est cette clé ? Elle suit quelle(s) règle(s) ?
On en revient toujours au même problème : il faudrait que tu nous donnes une description des tables et des liens.

Reply

Marsh Posté le 03-04-2009 à 13:50:21    

Hypothèse de départ (ben ouais, on est bien obligé d'émettre des hypothèses vu que tu ne nous donne pas toutes les infos dont on a besoin) :
table1 (id_table1, lib)
table2 (id_table2, id_table1, lib)
 
Echantillons :
table1 :  
1 / salle 1
2 / salle 2
 
table2 :
1 / 1 / tabouret
2 / 1 / chaise
3 / 2 / tabouret
 
résultat attendu :  
id_table1 / lib
1 / sale 1
 
requête :

Code :
  1. SELECT t1.id_table1, t1.lib
  2. FROM table1 t1 INNER JOIN table2 t2 ON t1.id_table1 = t2.id_table1
  3. WHERE t1.id_table1 IN (
  4.    SELECT id_table1
  5.    FROM table2
  6.    WHERE lib = "tabouret"
  7.       OR lib = "chaise"
  8.    GROUP BY id_table1
  9.    HAVING COUNT(id_table1) = 2
  10.    )


 
J'ai pas testé, c'est une idée, comme ça, qui me vient. A étudier !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 08-04-2009 à 10:34:30    

SuppotDeSaTante a écrit :

Ok la je pige mieux.
 
La jonction entre tes tables se fait comment ? Liaison de Table1 à Table2 ou tu as une table associative ?
 
C'est genant de passer par deux requetes ?
 
Sinon tu peux aussi compter le nombre d'occurence trouver (ici Salle1 : 2 et Salle2 : 1) tu tries pas ordre decroissant et tu prends le premier, ou le max


 
 
Compter le nombre d'occurences?
J'essaie de comprendre
 
Si je fais  

Code :
  1. select count(bien)"nombre de biens),salle "numéro de la salle)
  2. from table1 t,table2 t2
  3. where t1.idtable1=t2.idtable2
  4. and bien='tabouret'
  5. group by salle


 
Bonjour,
 
J'ai bien le nombre de tabourets dans chacune des salles mais ça ne me donne pas le nombre de chaises...En triant, je peux connaître la salle qui contient le plus de tabourets mais ça ne répond pas à ma question.
Je suis en train de regarder pour mieux expliquer et vos donner la structure plus tard.Ceci dit,mes requêtes que j'ai bien entendu testées fonctionnent y compris cette dernière,sans être un as,loin de là,en SQL et sans vraiment comprendre le lien qui existe entre ces 2 tables si ce n'est que c'est une clé primaire ou une clé de liaison ni utiliser les informations des autres colonnes.

Reply

Marsh Posté le 30-04-2009 à 13:33:33    

Bonjour à tous
 
Je me permets ce up. pour ajouter puisque je ne suis pas assez clair un élément concernant la clé. C'est un peu le même principe que dans le lien que j'ai cité (sid):
www.cs.albany.edu/~ganesh/cpsc304/SQL.pdf  
 
Chaque bien est identifié par un numéro: 1,2,3.............Cette clé est la même dans la table 1 et dans la table 2.

Reply

Marsh Posté le 30-04-2009 à 13:54:32    

Tu pourrais plutôt donner le résultat d'un DESC matable ?
Ca te prend 2 minutes, et on aura une description fiable de tes tables...


Message édité par macgawel le 30-04-2009 à 13:54:46
Reply

Marsh Posté le 04-05-2009 à 07:50:29    

Bonjour,
 
Voilà quelques éléments.
 

Code :
  1. select clé primaire,salle
  2. from Table 1


 
donne
 
Clé  Salle
1   100
1   100
1   100
1   101
1   102
1   102
..........
2   100
....
 
 
Explication: dans la salle 100, on a 3 fois le bien dont l'identifiant est 1, autrement dit 3 chaises comme expliqué ci-dessous.
 
 

Code :
  1. select clé primaire,bien
  2. from Table 2


 
donne
 
Clé   Bien
1      Chaise
2      Tabouret
..................
35    Placard

Message cité 1 fois
Message édité par TAM136 le 04-05-2009 à 07:54:31
Reply

Marsh Posté le 04-05-2009 à 09:39:47    

TAM136 a écrit :

Code :
  1. select clé primaire,salle
  2. from Table 1


 
donne
 
Clé  Salle
1   100
1   100
1   100
1   101
1   102
1   102
..........
2   100
....

:heink:  
Une clé primaire est par définition unique.
 
En l'absence de la description des tables - qu'on te demande depuis plus d'un mois - je dirais :
Tu ne respectes pas du tout les règles des bases de données relationnelles.
=> On ne peut rien faire pour toi.

Reply

Marsh Posté le 04-05-2009 à 13:01:08    

macgawel a écrit :

:heink:  
Une clé primaire est par définition unique.
 
En l'absence de la description des tables - qu'on te demande depuis plus d'un mois - je dirais :
Tu ne respectes pas du tout les règles des bases de données relationnelles.
=> On ne peut rien faire pour toi.


 
La clé est bien primaire puisqu'elle identifie un seul type de bien.S'il y a plusieurs fois 1, c'est tout simplement parce qu'il y a plusieurs fois le même type de bien: 3*1 pour 3 fois une chaise par exemple.C'est tout à fait logique.Maintenant, évidemment pour faire la distinction entre chaque chaise, il y a une colonne avec un numéro. A ce propos,concernant la structure des tables, je l'ai bien donnée maintenant.Il y a bien sûr d'autres colonnes dont celle dont je viens de parler mais qui n'ont aucun intérêt pour ce que je souhaite faire.
Bien, visiblement, je ne suis pas assez clair.Tant pis.Je resterai sur ma requête même si elle est un peu lourde et pas très jolie.En tout cas, elle fonctionne sans faire appel aux autres colonnes.


Message édité par TAM136 le 04-05-2009 à 13:02:13
Reply

Marsh Posté le 04-05-2009 à 13:43:33    

1 - as-tu vu mon message ?
2 - vas-tu oui ou non nous poster une vrai description de tes tables ? Si non, alors tu peux clore le sujet tout-de-suite.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 04-05-2009 à 14:12:14    

Wikipédia :

Citation :

Deux lignes distinctes de la table ne peuvent pas avoir les mêmes valeurs pour les champs définis au niveau de la clé primaire.


Je veux bien te croire quand tu dis que c'est logique. Mais ce n'est pas la logique d'une BDD Relationnelle.
 
Et non, tu n'as pas donné la structure des tables. Pour preuve, tu ne peux pas avoir, dans une BDD-R, une clé primaire qu'on retrouve plusieurs fois. (ou alors, tu n'es pas dans un système Relationnel).
 
En gros, théoriquement quand on te donne une clé primaire, tu dois pouvoir retrouver l'unique élément concerné.
Et là, si je te parle du "1" de ta Table1, tu ne peux pas me dire de quel élément il s'agit...
 
 
Par curiosité, tu utilises quel système de gestion ? Access ?

Reply

Marsh Posté le 11-05-2009 à 16:43:21    

Bonjour

macgawel a écrit :

Par curiosité, tu utilises quel système de gestion ? Access ?


 
Je ne comprends pas la remarque désobligeante sur Access mais c'est pas grave.
 
Maintenant je pense que :
select clé primaire,salle
from Table 1
est un exemple ecrit a la va vite, surtout aux vues de l'explication d'en dessous :
Explication: dans la salle 100, on a 3 fois le bien dont l'identifiant est 1, autrement dit 3 chaises comme expliqué ci-dessous.
Le resultat renvoit x fois la clé primaire de la table Table2 (la table des "biens" ) ce qui est normal, vu que c'est une clé secondaire de la table Table1 (ou d'une table associative Biens/Salles, peu importe).
On a la meme chaise dans 3/4/5/x salles.
Je ne vois pas le souci du relationnel.
 
Apres, si ta requete du départ fonctionne, ne te prends pas la tete, garde celle la.
Car te donner directe la requete qui repondrait à la salle qui contient un lit ET un tabouret sans avoir ni une bribe de modele ou vrai morceau de dictionnaire c'est assez chiant ;)


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 15-05-2009 à 07:48:12    

Bonjour,
 
Si un modo passe par là,merci de locker ce topic.Les polémiques seront ainsi évitées.

Reply

Marsh Posté le 15-05-2009 à 09:05:34    

TAM136 a écrit :

Bonjour,
 
Si un modo passe par là,merci de locker ce topic.Les polémiques seront ainsi évitées.


Et ledit modo ne pourra que constater que ces polémiques viennent en grande partie de ta formidable incapacité à fournir des informations exhaustives et à exprimer clairement ton besoin.

Reply

Marsh Posté le 15-10-2009 à 12:51:53    

Bonjour,
 
Je remonte ce topic qui a été ouvert à ma demande par la modération pour apporter la solution qui m' a été donnée.
 
select distinct salle «n° de salle»
from Table 1 a,Table 2 b
where a.idTable 1=b.id Table 2
and Bien in('Chaise',Tabouret’)
group Salle
having count(distinct Bien)=2
 
 

Reply

Marsh Posté le 15-10-2009 à 14:19:37    

TAM136 a écrit :

Bonjour,
 
Je remonte ce topic qui a été ouvert à ma demande par la modération pour apporter la solution qui m' a été donnée.
 
select distinct salle «n° de salle»
from Table 1 a,Table 2 b
where a.idTable 1=b.id Table 2
and Bien in('Chaise',Tabouret’)
group Salle
having count(distinct Bien)=2
 
 


 
C'est marrant, ça ressemble beaucoup à ce que j'avais posté pour t'aider. Remplace la jointure "where" par une "inner join", et c'est ce que j'avais posté :o


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed