[SQL] Probleme bateau ?

Probleme bateau ? [SQL] - Programmation

Marsh Posté le 29-04-2001 à 13:40:06    

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]

Reply

Marsh Posté le 29-04-2001 à 13:40:06   

Reply

Marsh Posté le 29-04-2001 à 13:47:50    

Sous quel SGDB-R ?

Reply

Marsh Posté le 29-04-2001 à 13:48:34    

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...

Reply

Marsh Posté le 29-04-2001 à 13:49:35    

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

Reply

Marsh Posté le 29-04-2001 à 13:58:40    

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]

Reply

Marsh Posté le 29-04-2001 à 14:02:11    

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)

Reply

Marsh Posté le 29-04-2001 à 14:03:24    

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 ;)

Reply

Marsh Posté le 29-04-2001 à 14:11:07    

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 ?

Reply

Marsh Posté le 29-04-2001 à 14:13:53    

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]

Reply

Marsh Posté le 29-04-2001 à 14:16:49    

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:

Reply

Marsh Posté le 29-04-2001 à 14:16:49   

Reply

Marsh Posté le 29-04-2001 à 14:17:43    

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

Reply

Marsh Posté le 29-04-2001 à 14:24:31    

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 ! :)

Reply

Marsh Posté le 30-04-2001 à 09:34:34    

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"
Reply

Marsh Posté le 30-04-2001 à 09:46:41    

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"
Reply

Marsh Posté le 30-04-2001 à 09:56:04    

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  
Reply

Marsh Posté le 30-04-2001 à 10:24:49    

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"
Reply

Marsh Posté le 30-04-2001 à 12:06:25    

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

Reply

Marsh Posté le 30-04-2001 à 12:22:29    

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"
Reply

Marsh Posté le 30-04-2001 à 12:23:32    

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

 

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

Reply

Sujets relatifs:

Leave a Replay

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