RESOLU [SQL] Comment faire une telle requète dans une DB multivaluée?

RESOLU [SQL] Comment faire une telle requète dans une DB multivaluée? - SQL/NoSQL - Programmation

Marsh Posté le 20-04-2003 à 14:25:56    

Prenons la table suivante toute simple:
 
Produits:
  - ID 1:1 (unique)
  - Usine 1:n
 
où usine est mutlivalué
 
J'aimerais savoir comment trouver l'ID du(des) produit(s) qui sont fabriqués par le plus grand nombre d'usines.
 
J'avais pensé à ça:
 
SELECT P.ID FROM Produits AS P  
WHERE count(P.Usine)=MAX(SELECT count(P2.Usine) FROM Produits AS P2)
 
Mais je n'ai aucune SGDB multivaluée sous la main pour tester la requète.
 
Si qq'un pouvait m'aider, c'est très important, merci!


Message édité par gizmo le 22-04-2003 à 13:46:27
Reply

Marsh Posté le 20-04-2003 à 14:25:56   

Reply

Marsh Posté le 20-04-2003 à 15:41:51    

TP rulez :sol:

Reply

Marsh Posté le 20-04-2003 à 16:31:19    

Bah non, c'est pas pour un TP, je dois faire un module de traduction de requète SGDB multivalué -> SGDB relationnel classique. Seulement, je ne connais pas bien toutes les subtilités des multivalués et leur syntaxe.

Reply

Marsh Posté le 21-04-2003 à 22:40:52    

Bah je sais pas ce qu'est un SGBD multivaulé.
 
Ca diffère en quoi d'un SGBDR ?

Reply

Marsh Posté le 22-04-2003 à 09:47:10    

un DB multivaluée, c'est un DB dans laquelle un champs peut avoir un vecteur de valeurs. Ca permet d'éviter d'avoir une deuxième table avec la référence à un produit et touts les id référencé.
 
Par exemple, ca permet de mettre dans un même champs tous les numéros de téléphones de qq'un au lieu de créer une nouvelle table. Et ce, sans savoir combien de numéro il peut y avoir et sans utiliser un artifice de séparation comme une virgule.

Reply

Marsh Posté le 22-04-2003 à 10:52:40    

Ah ok, ça évite donc d'avoir des tables filles.
 
Hmmmm... Ben à priori, c'est une syntaxe qui doit différer du SQL classique quand même...
 
A moins que...
 
T'as essayé un truc du genre :
 
SELECT table.champMuliValué where table.id = xx
 
Genre, pour voir s'il te retourne plusieurs lignes ou une seule. S'il retourne plusieurs lignes, alors à priori, ta requête sera :
 
SELECT P.ID, COUNT(P.Usine) FROM Produits
GROUP BY P.ID
HAVING count(P.Usine)=MAX(SELECT count(P.Usine) FROM Produits)

Reply

Marsh Posté le 22-04-2003 à 11:01:42    

Ben non, j'ai pas essayé, vu que:
 

Citation :


Mais je n'ai aucune SGDB multivaluée sous la main pour tester la requète.

 
 
Oracle 9i gère les multivalués, mais c'est un peu cher pour faire juste quelques tests :D

Reply

Marsh Posté le 22-04-2003 à 12:12:13    

gizmo a écrit :

Ben non, j'ai pas essayé, vu que:
 

Citation :


Mais je n'ai aucune SGDB multivaluée sous la main pour tester la requète.

 
 
Oracle 9i gère les multivalués, mais c'est un peu cher pour faire juste quelques tests :D


Si tu as Linux, tu peux télécharger gratuitement Oracle 9i pour Linux, tant que ça reste dans le cadre de tests bidouilles. (version personnelle, qui est gratuite)

Reply

Marsh Posté le 22-04-2003 à 12:42:18    

intéressant, je ne savais pas cela, je vais regarder de ce coté.
Merci

Reply

Marsh Posté le 22-04-2003 à 13:46:07    

J'ai trouvé qq'un qui m'a donné le code Oracle, le problème est donc résolu.

Reply

Marsh Posté le 22-04-2003 à 13:46:07   

Reply

Marsh Posté le 22-04-2003 à 14:36:43    

Tu peux le poster pour nous en faire profiter ?

Reply

Marsh Posté le 22-04-2003 à 14:39:14    

Bien sur:
 

Citation :


SQL> create type manuf_t is table of number;
  2  /
Type created.
 
SQL> create table products
  2  ( product_id number primary key
  3  , product_name varchar2(30)
  4  , manufacturers manuf_t
  5  ) nested table manufacturers store as product_manufacturers;
 
Table created.
 
SQL> insert into products values (1,'puppet',manuf_t(1,3,5));
1 row created.
 
SQL> insert into products values (2,'balloon',manuf_t(2));
1 row created.
 
SQL> insert into products values (3,'teddy bear',manuf_t(1,2,4));
1 row created.
 
SQL> insert into products values (4,'puzzle',manuf_t(3,6));
1 row created.
 
SQL> select product_name
  2  from   products p, table(p.manufacturers) pm
  3  group by p.product_name
  4  having count(*) =
  5  ( select max(cnt) from
  6    ( select count(*) cnt
  7      from products p, table(p.manufacturers) pm
  8      group by p.product_id
  9    )
 10* );
 
PRODUCT_NAME
------------------------------
puppet
teddy bear

 
 
c'est réalisé en utilisant une nested table.

Reply

Marsh Posté le 22-04-2003 à 14:56:12    

ok :jap:
 
y'a pas à dire, j'aime mieu une bonne vrai table, c'est plus propre :)

Reply

Marsh Posté le 22-04-2003 à 15:07:00    

moi aussi, mais j'ai pas le choix pour ce travail :/

Reply

Sujets relatifs:

Leave a Replay

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