Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2584 connectés 

  FORUM HardWare.fr
  Programmation

  [SQL] Probleme bateau ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Probleme bateau ?

n°28374
Hugo_Tooro​p
Posté le 29-04-2001 à 13:40:06  profilanswer
 

J'ai une autre petite question a propos d'une requete SQL. Voila, j'ai deux tables, l'une avec des noms de fromage, et l'autre avec des notes pour certains de ces fromages (tous n'ont pas été noté). Par exemple :
 

Citation :


[I]Table CHEESE :[/I]
CHEESENAME                      
==============================  
 
Gorwydd Caerphilly              
Bath Soft                      
Single Gloucester              
Devon Oke
 
[I]Table RATES :[/I]
CHEESENAME                          RATING  
============================== ===========  
 
Gorwydd Caerphilly                       4  
Single Gloucester                        5  


 
Et ce que j'aimerai, c'est faire une requete pour generer une troisieme table, avec la liste des 4 fromages, et en mettant la note '0' pour les fromages qui ne sont pas deja noté (c'est-a-dire dans ce cas 'Bath soft' et 'Devon oke'). Comme ca :
 

Citation :


[I]Table RATES_ALL :[/I]
CHEESENAME                          RATING  
============================== ===========  
 
Gorwydd Caerphilly                       4  
Single Gloucester                        5  
Bath Soft                                0
Devon Oke                                0


 
Mes connaissances en SQL date d'il y a plus d'un an, et je n'ai plus la moindre d'idée de la facon de faire ca ! Quelqu'un aurait une idée ?? Merci d'avance !

 

[edit]--Message édité par Hugo_Toorop--[/edit]

mood
Publicité
Posté le 29-04-2001 à 13:40:06  profilanswer
 

n°28376
MagicBuzz
Posté le 29-04-2001 à 13:47:50  profilanswer
 

Sous quel SGDB-R ?

n°28377
MagicBuzz
Posté le 29-04-2001 à 13:48:34  profilanswer
 

C'est en effet une fonction "Avancée" de SQL non spécifiée dans la norme initiale, et donc chacun à choisi sa propre solution...

n°28378
Hugo_Tooro​p
Posté le 29-04-2001 à 13:49:35  profilanswer
 

J'utilise Interbase 5.5, il date un peu (1998).

n°28379
MagicBuzz
Posté le 29-04-2001 à 13:58:40  profilanswer
 

Bon, y'a plus simple, mais je trouve plus... :(
 
SELECT CHEESENAME, CHESSE_RATE_FROM (
  SELECT CHEESE.CHEESENAME, RATES.CHESSE_RATE
  FROM   CHEESE, RATES
  WHERE  CHEESE.CHEESENAME = RATES.CHEESENAME
  UNION
  SELECT CHEESENAME, 0
  FROM   CHEESE
  WHERE  CHEESENAME NOT IN (SELECT CHEESENAME FROM RATES)
)
 
(Oracle)

 

[edit]--Message édité par magicbuzz--[/edit]

n°28382
MagicBuzz
Posté le 29-04-2001 à 14:02:11  profilanswer
 

S'il accepte "SELECT FROM SELECT" et "IN SELECT", c'est bon :)
 
PS: S'il se croûte comme un bleu il reconnait peut-être d'autes syntaxes genre :
 
SELECT RES_TAB.CHEESENAME, RES_TAB.CHESSE_RATE_FROM (  
  SELECT CHEESE.CHEESENAME, RATES.CHESSE_RATE  
  FROM   CHEESE, RATES  
  WHERE  CHEESE.CHEESENAME = RATES.CHEESENAME  
  UNION  
  SELECT CHEESENAME, 0  
  FROM   CHEESE  
  WHERE  CHEESENAME NOT IN (SELECT CHEESENAME FROM RATES)  
) AS RES_TAB
 
(SQL Server)

n°28383
MagicBuzz
Posté le 29-04-2001 à 14:03:24  profilanswer
 

PS: Euh... Si pas la même occasion tu voulais bien même un ID (auto-incrément) de type "INTEGER" en clé primaire, ce serait cool ;)

n°28384
Hugo_Tooro​p
Posté le 29-04-2001 à 14:11:07  profilanswer
 

Je viens d'essayer, il accepte les IN SELECT mais pas les FROM SELECT, et la deuxieme solution que tu donnes, il la veut pas non plus ! Il y a un moyen de contourner ca, sans faire appel aux vues ?

n°28385
MagicBuzz
Posté le 29-04-2001 à 14:13:53  profilanswer
 

Sinon, en simple, suffit de faire une jointure externe puis remplacer la valeur NULL par 0 à la volée...
 
Mais je trouve plus la syntaxe :(
 
SQL Server : (mais c'est celui qui est le plus éloigné de tous à ce niveau, car il utilise les fonction VB...)
 
SELECT cheese.cheesename, replace(rates.rate, NULL, 0)
FROM chesse, rates
WHERE cheese.cheesename *= rates.cheesename

 

[edit]--Message édité par magicbuzz--[/edit]

n°28387
MagicBuzz
Posté le 29-04-2001 à 14:16:49  profilanswer
 

Mais le mieu, c'est de conserver "NULL"
 
Ben ouais... Entre "Pas de note" et 0, y'a un monde ! ;)
 
Deplus, pkoi tu veux faier une table de plus ?
Les vues, ça sert à ça :p
 
CREATE OR REPLACE VIEW RATES_ALL AS
SELECT cheese.cheesename, rates.rate
FROM chesse, rates  
WHERE cheese.cheesename *= rates.cheesename
 
 
ou
 
 
CREATE OR REPLACE VIEW RATES_ALL AS
SELECT cheese.cheesename, rates.rate
FROM chesse, rates  
WHERE cheese.cheesename = rates.cheesename(+)
 
le (+) je sais jamais où faut le mettre :lol:

mood
Publicité
Posté le 29-04-2001 à 14:16:49  profilanswer
 

n°28388
MagicBuzz
Posté le 29-04-2001 à 14:17:43  profilanswer
 

L'avantage de la vue, c'est que :
 
1) C'est aussi rapide d'éxécution (surtout là, où y'a pas de grosses jointures)
 
2) Les données sont mises à jour instantanément
 
3) Aucune place sur le disque utilisée

n°28390
Hugo_Tooro​p
Posté le 29-04-2001 à 14:24:31  profilanswer
 

Ben ouais, en principe, on a pas le droit aux vues, on nous a demandé de tout faire en une seule requete. Mais c'est vrai que c'est tres con, surtout qu'on a le droit d'utiliser que cette grosse antiquité d'Interbase :D
La premiere requete que tu m'as donné, en enlevant la SELECT FROM SELECT donne en partie la réponse, c'est déja ca ! Sinon, je vais chercher dans la doc d'Interbase comment faire une jointure externe, il y a peut-etre une technique toute con pour faire ca. Merci pour ton coup de main ! :)

n°28444
wouatouwou​atou
Posté le 30-04-2001 à 09:34:34  profilanswer
 

hihihi... Ca ressemble fort a mon pb..
Enfin.. je veux dire par la ke ton chef de projet si t'en a un... il a du faire la meme ecole ke le mien :D:D:D
Sinon, pour ton pb.. je me penche dessus..


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
n°28447
wouatouwou​atou
Posté le 30-04-2001 à 09:46:41  profilanswer
 

Ca y est.. ej crois que jai une soluce... :D
Mais c pour ORACLE... ptet ke tu peux le modifier pour sql-server.
 

Code :
  1. SELECT C.CHEESENAME, R.RATING
  2. FROM CHEESE C, RATES R
  3. WHERE
  4. C.CHEESENAME=R.CHEESENAME
  5. UNION
  6. SELECT C.CHEESENAME, 0
  7. FROM CHEESE C, RATES R
  8. WHERE
  9. C.CHEESENAME=R.CHEESENAME(+)
  10. HAVING
  11. R.RATING IS NULL


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
n°28451
jupiler
Un cousin...
Posté le 30-04-2001 à 09:56:04  profilanswer
 

pourquoi se faire chier avec un union:
 
SELECT C.CHEESENAME, nvl(R.RATING, 0)  
FROM CHEESE C, RATES R  
WHERE  
C.CHEESENAME=R.CHEESENAME (+)
 
c'est aussi pour Oracle


---------------
Je ne suis ni pour, ni contre, bien au contraire  
n°28456
wouatouwou​atou
Posté le 30-04-2001 à 10:24:49  profilanswer
 

ouais.. mais la fonction nvl() ... jsais pas si on peux facilement la trouver sur d'autres sgbd...
Je voulais surtout parler de la jointure externe :D
et avec un union on essaie au plus de rester standard


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
n°28481
MagicBuzz
Posté le 30-04-2001 à 12:06:25  profilanswer
 

Pkoi vous répétez bêtemment ce que j'ai déjà écrit ?

n°28487
wouatouwou​atou
Posté le 30-04-2001 à 12:22:29  profilanswer
 

l'idée y est .. magic.. mais moi ya le

Code :
  1. having

:D
mais, le pb. c ke la syntaxe de la jointure externe depend du sgbd :(


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
n°28489
MagicBuzz
Posté le 30-04-2001 à 12:23:32  profilanswer
 

c'est un fait ;)
d'où ma toute première question :D
 
:fou:

 

[edit]--Message édité par magicbuzz--[/edit]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [SQL] Probleme bateau ?

 

Sujets relatifs
[SQL] Question pour determiner un prix minimum[VB,SQL Server] format date
[SQL] => Elle me soûle cette requête qui veut pô marcher !!!!!![SQL] Trigger pour empecher d'inserer une valeur
[Sql server Sybase] Bloquer exécution proc stockée sur host name[ASP] problème d'accès à une base access depuis global.asa
[SQL Server] Tables system[PHP] Apache - PHP - Sybase SQL Server 11...
Petit probleme Simple en C[SQL Server] Transaction, rollback
Plus de sujets relatifs à : [SQL] Probleme bateau ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR