c'est un fait ;)
d'où ma toute première question :D
:fou:
[edit]--Message édité par magicbuzz--[/edit]
wouatouwouatou
l'idée y est .. magic.. mais moi ya le
Code :
having
:D
mais, le pb. c ke la syntaxe de la jointure externe depend du sgbd :(
MagicBuzz
Pkoi vous répétez bêtemment ce que j'ai déjà écrit ?
wouatouwouatou
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
jupiler
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
wouatouwouatou
Ca y est.. ej crois que jai une soluce... :D
Mais c pour ORACLE... ptet ke tu peux le modifier pour sql-server.
Code :
SELECT C.CHEESENAME, R.RATING
FROM CHEESE C, RATES R
WHERE
C.CHEESENAME=R.CHEESENAME
UNION
SELECT C.CHEESENAME, 0
FROM CHEESE C, RATES R
WHERE
C.CHEESENAME=R.CHEESENAME(+)
HAVING
R.RATING IS NULL
wouatouwouatou
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..
Hugo_Toorop
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 ! :)
MagicBuzz
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
MagicBuzz
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:
MagicBuzz
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]
Hugo_Toorop
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 ?
MagicBuzz
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 ;)
MagicBuzz
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)
MagicBuzz
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]
Hugo_Toorop
J'utilise Interbase 5.5, il date un peu (1998).
MagicBuzz
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...
MagicBuzz
Sous quel SGDB-R ?
Hugo_Toorop
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 :
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 :
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 !