Récupérer 2 valeurs et + avec deux tables(SQL Server) - SQL/NoSQL - Programmation
Marsh Posté le 10-03-2009 à 15:34:03
soit tu fais un IN(SELECT) soit des IN(val1,val2)
Marsh Posté le 11-03-2009 à 08:00:01
ReplyMarsh 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
Marsh Posté le 01-04-2009 à 08:09:27
SuppotDeSaTante a écrit : Salut TAM136 |
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.
Marsh Posté le 01-04-2009 à 09:20:06
TAM136 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)
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'
Marsh Posté le 01-04-2009 à 14:03:34
SuppotDeSaTante a écrit : |
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.
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.
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... |
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 : |
En fait le 1er in n’a aucun intérêt. La requête devient ainsi:
Code :
|
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]
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, Où id table1=id table2 ET Où (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
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 |
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.
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...
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
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 |
Evidemment que valeur1 est différent de valeur2: valeur1=tabouret par exemple et valeur 2=chaise.
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
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
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 |
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. |
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 :
|
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 :
|
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.
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
Marsh Posté le 03-04-2009 à 10:52:51
TAM136 a écrit : Table1 Table2 |
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
Pour faire du relationnel :
Table1 = TableSalles (IdSalle, NomSalle, <autres informations sur les salles> ) |
Table2 = TableMeubles (IdMeuble, NomMeuble, <autres informations sur les meubles> ) |
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
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.
Vu ce que tu veux faire, il y a une liaison entre les deux tables. |
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
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.
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 :
|
J'ai pas testé, c'est une idée, comme ça, qui me vient. A étudier !
Marsh Posté le 08-04-2009 à 10:34:30
SuppotDeSaTante a écrit : Ok la je pige mieux. |
Compter le nombre d'occurences?
J'essaie de comprendre
Si je fais
Code :
|
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.
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.
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...
Marsh Posté le 04-05-2009 à 07:50:29
Bonjour,
Voilà quelques éléments.
Code :
|
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 :
|
donne
Clé Bien
1 Chaise
2 Tabouret
..................
35 Placard
Marsh Posté le 04-05-2009 à 09:39:47
TAM136 a écrit :
|
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.
Marsh Posté le 04-05-2009 à 13:01:08
macgawel a écrit : |
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.
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.
Marsh Posté le 04-05-2009 à 14:12:14
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 ?
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
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.
Marsh Posté le 15-05-2009 à 09:05:34
TAM136 a écrit : Bonjour, |
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.
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
Marsh Posté le 15-10-2009 à 14:19:37
TAM136 a écrit : Bonjour, |
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é
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
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:
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:
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.