quelle formule SQL pour cette table ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : quelle formule SQL pour cette table ?

par x0s » 12 mai 2008, 11:28

Le plus simple, dans la mesure où dans les deux tables le champs commun est num_magasin, est d'opter pour un NATURAL JOIN :

SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin NATURAL JOIN Factures
WHERE montant_facture>=1500;

Sinon vous pouvez optez pour :

SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin, Factures
WHERE Magasin.num_magasin=Factures.num_magasin and montant_facture>=1500;
Il y a encore une autre manière d'effectuer ce genre de jointure, c'est d'utiliser les jointures internes (INNER JOIN). En effet Les jointures naturelles (NATURAL JOIN sont assez ambiguës car lors de l'évolution d'un projet ou de la structure de la base de donnée concernée, il y a un grand risque qu'il n'y ait plus de jointure 'naturelle" à proprement parlé.
De plus le compilateur SQL cherche par lui-même un champs unique correspondant entre les deux tables, en utilisant INNER JOIN et la clause USING , il devient possible de faire une jointure interne spécifiée, comme ça le compilateur ne tourne pas en rond, et la requête garde son sens original.

Code : Tout sélectionner

SELECT mag.nom_magasin, mag.num_magasin, fact.montant_facture, fact.num_magasin FROM Magasin mag INNER JOIN Factures fact USING(num_magasin) HAVING fact.montant_facture>=1500;
PS: la clause USING est également utilisable dans une jointure naturelle.

par caroube » 09 mai 2008, 18:34

Caroube => quand je disais sensible à la casse j'entendais qu'il ne comprendrait pas que "Magasin" et "magasin" sont une seule et même table (à moins que la dernière version de SQL le prenne en charge, ça je ne peux pas le dire je n'y suis pas encore passée).
Je confirme : on ne peut pas dire que SQL est sensible à la casse ou pas.

Si tu prends des bases de données telle que Oracle, MySQL, SQLite, Access, SQLAnywhere, ... tu peux écrire "Magasin" ou "magasin". Par contre, les produits "Microsoft SQL Server" ou "Sybase SQL Server" sont sensibles à la casse (du moins dans le paramétrage par défaut).

Et je vais le dire une dernière fois avant de laisser tomber. Qu'est-ce que ça te dit si tu mets "num_magasin" au lieu de "num-magasin" dans ta requête ? Parce que là, on tourne en rond autour d'une erreur de frappe !!!
Dans ce cas je vous conseille d'utiliser l'écriture plus spécifique de SQL qui consiste à encadrer le nom des champs avec des ` (touches Alt Gr + 7).
Au risque de passer pour un emm..., je dis non, ce n'est pas une bonne idée. Cette apostrophe ` est un pis-aller dans les cas où l'on est obligé d'avoir des noms de champs qui comportent des espaces, des accents, des mots réservés, ...
1) On est quasiment jamais obligé.
2) Ce n'est pas une syntaxe SQL standard. De nombreuses bases de données ne supportent pas ce caractère.
3) Dans ce cas, le champ dans la base s'appelle num_magasin et pas num-magasin !
Concernant le fait que num_magasin soit un champs ambigu, ici il n'y a pas d'ambiguité, c'est bien une valeur commune à deux tables, d'où la possibilité d'un NATURAL JOIN.
je ne parle pas du natural join (syntaxe haïssable à mon avis), mais de l'ambiguité de ce qu'il y a entre le select et le from. Si vous avez deux tables avec un même nom de champ, vous ne pouvez pas faire la requête sans préfixer (imaginez que les identifiants de Produit et de magasin s'appellent id)

par Thegritch » 09 mai 2008, 14:35

Je conseil cette piste avec des alias :

Code : Tout sélectionner

SELECT mag.nom_magasin, mag.num_magasin, fac.montant_facture FROM Magasin mag, Factures fac WHERE mag.num_magasin = fac.num_magasin AND fac.montant_facture>=1500;
Sinon mysql met normalement des messages d'erreur.
Cela évite de se tromper dans les noms de champs.

Cordialement,

par animithra » 09 mai 2008, 13:14

Il demande la valeur du paramètre num, dans ce cas peut être comprend-il qu'il s'agit d'une opération (num - magasin et non pas 'num-magasin').
Dans ce cas je vous conseille d'utiliser l'écriture plus spécifique de SQL qui consiste à encadrer le nom des champs avec des ` (touches Alt Gr + 7).

Caroube => quand je disais sensible à la casse j'entendais qu'il ne comprendrait pas que "Magasin" et "magasin" sont une seule et même table (à moins que la dernière version de SQL le prenne en charge, ça je ne peux pas le dire je n'y suis pas encore passée).

Concernant le fait que num_magasin soit un champs ambigu, ici il n'y a pas d'ambiguité, c'est bien une valeur commune à deux tables, d'où la possibilité d'un NATURAL JOIN.
Maintenant il est effectivement plus logique d'écrire table1.champs = table2.champs pour éviter les pannes si on change le nom de la colonne dans la base de données, ça j'en conviens volontier.

par letcheuv » 09 mai 2008, 11:30

Jsais pas parce que j'ai mis Factures au pluriel.

Voila l'imprim écran:

http://www.hiboox.com/lang-fr/image.php ... 5x8z2e.jpg

par caroube » 08 mai 2008, 23:36

SQL est sensible à la casse.
Ce n'est pas vrai.
SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin, Factures
WHERE Magasin.num_magasin=Factures.num_magasin and montant_facture>=1500;
1) Quoique tu fasses, quand tu écris num-magasin, ce n'est pas num_magasin.
2) Quand on fait une jointure, on préfixe les noms des champs par le nom de la table. Surtout quand il y a ambiguité pour un champ qui porte le même nom dans deux tables.

Code : Tout sélectionner

SELECT Magasin.nom_magasin, Magasin.num_magasin, Factures.montant_facture FROM Magasin, Factures WHERE Magasin.num_magasin=Factures.num_magasin and Factures.montant_facture>=1500;
Dernière remarque : cela ne change rien à la syntaxe, mais pourquoi la table magasin porte t'elle un nom au singulier et la table Factures un nom au pluriel ?

par animithra » 08 mai 2008, 21:04

Cela vous demande d'entrer des valeurs ? pourriez-vous être plus précis (imprim écran ou copier/coller de l'erreur obtenue)

par Invité » 08 mai 2008, 19:38

Désolé Animitha j'ai essayer avec votre requette et sa ne fonctionne toujours pas...

Sa me demende d'entré des valeurs alors que je voudrais un tableau qui affiche le num_magasin, nom_magasin, et le montant des achats des magasins ayant acheté pour plus de 1500 €

par Invité » 08 mai 2008, 19:34

Le champs spécifié 'num_magasin" peut désigner plusieurs tables listé dans le clause FROM de votre instruction SQL....

par animithra » 08 mai 2008, 19:34

Bonsoir.

Ce qui ne fonctionne pas c'est ça :
SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin, Factures
WHERE magasin.num_magasin=factures.num-magasin And montant_facture>=1500;
SQL est sensible à la casse.

Le plus simple, dans la mesure où dans les deux tables le champs commun est num_magasin, est d'opter pour un NATURAL JOIN :

SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin NATURAL JOIN Factures
WHERE montant_facture>=1500;

Sinon vous pouvez optez pour :

SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin, Factures
WHERE Magasin.num_magasin=Factures.num_magasin and montant_facture>=1500;

En espérant vous avoir dépanné.

Julie.

par caroube » 08 mai 2008, 19:30

num-magasin
Et avec num_magasin au lieu de num-magasin ?

par letcheuv » 08 mai 2008, 19:05

SELECT nom_magasin, num-magasin, montant_facture
FROM Magasin, Factures
WHERE magasin.num_magasin=factures.num-magasin And montant_facture>=1500;

Sa marche pas...

par letcheuv » 08 mai 2008, 18:51

J'ai pour l'instant écris aucun début de requette....

Ce lien doit fonctionner:
http://images0.hiboox.com/images/1908/lb6esvhg.jpg

par Webmastore » 08 mai 2008, 18:47

Le lien redirige vers la page d'accueil du site hiboox... donc difficile de repondre a la question

par caroube » 08 mai 2008, 18:47

1) Ton image n'est pas visible. Merci de vérifier le lien.
2) Quel est le début de requête que tu as commencé à écrire ?