Probleme bateau ? [SQL] - Programmation
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...
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]
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)
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
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 ?
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]
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
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
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
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
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 !
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
Sinon, pour ton pb.. je me penche dessus..
Marsh Posté le 30-04-2001 à 09:46:41
Ca y est.. ej crois que jai une soluce...
Mais c pour ORACLE... ptet ke tu peux le modifier pour sql-server.
Code :
|
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
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
et avec un union on essaie au plus de rester standard
Marsh Posté le 30-04-2001 à 12:22:29
l'idée y est .. magic.. mais moi ya le
Code :
|
mais, le pb. c ke la syntaxe de la jointure externe depend du sgbd
Marsh Posté le 30-04-2001 à 12:23:32
c'est un fait
d'où ma toute première question
[edit]--Message édité par magicbuzz--[/edit]
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 :
[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 :
[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]