2009-04-20 4 views
1

J'ai une requête qui fonctionne comme:plusieurs sous-requêtes lors du regroupement

select table_one.x, sum(table_one.y) 
(select foo from table_two where table_one.x = table_two.x) as item_description 
from table_one 
inner join table_two 
on table_one.x = table_two.x 
-- where table_2 row has various attributes 
group by table_one.x 

Le groupement signifie que je besoin d'un sous-sélection pour accéder foo de la table deux. Maintenant, si je veux sélectionner une deuxième colonne de la table deux, y at-il un moyen d'y accéder sans un second sous-select?

La base de données est DB2. Join est plusieurs à un, c'est-à-dire pensez à table_one comme commandes et table_b comme contenant des informations pour l'élément.

Répondre

2

est-ce que table_two a plusieurs lignes pour chaque table_one.x ou est-ce une jointure de un-2-one ... si c'est one-2-one, alors cela ne fait pas ce que vous voulez ... puisque votre sous- sélectionnez est fait dans les mêmes conditions que votre rejoindre

SELECT 
    table_one.x, table_two.foo, sum(table_one.y) 
FROM table_one 
    INNER JOIN table_two 
     ON table_one.x = table_two.x 
GROUP BY 
    table_one.x, table_two.foo 
0
SELECT * 
FROM (
     SELECT x, SUM(y) 
     FROM table_one 
     GROUP BY 
       x 
     ) AS t1 
INNER JOIN 
     table_two t2 
ON  t2.x = t1.x 
-- where table_2 row has various attributes 
+0

la performance ne peut pas être bon pour cela comme il se matérialise t1 t2 avant de se joindre à – kishore

+0

Je ne sais pas DB2 en profondeur, mais Oracle et MS SQL ne matérialise pas la vue entière à condition qu'il y ait un index sur table_one (x). – Quassnoi