2010-11-18 3 views
1

Pour ma propre création, j'essaie d'écrire cette fonctionnalité SQL dans une instruction unique sans utiliser de tables temporaires. Pour la vie de moi, je ne peux pas obtenir la requête pour fonctionner sans avoir un MySQL "ERROR 1248 (42000): Chaque table dérivée doit avoir son propre alias."Veuillez expliquer comment exprimer ce SQL en tant qu'expression unique à l'aide de tables dérivées

est ici quelque chose de semblable, quoique brisé, à ce que je veux:

SELECT split.share, split.weight, split.creditor, split.debtor, share.amount, wsum.sum 
FROM (
    SELECT split.share, split.weight, split.creditor, split.debtor, share.amount 
    FROM (split LEFT JOIN share ON split.share = share.id) 
    WHERE debtor = 6 OR creditor = 6) 
    LEFT JOIN (
     SELECT split.share, SUM(weight) AS sum 
     FROM split 
     GROUP BY split.share 
    ) wsum 
    ON split.share = wsum.share; 

est ici une version de travail de ce que je suis en train de exprimés à l'aide des tables temporaires:

CREATE TEMPORARY TABLE weightsum (share INT, sum INT); 

INSERT INTO weightsum (share, sum) 
SELECT split.share, SUM(weight) AS sum 
FROM split 
GROUP BY split.share; 

CREATE TEMPORARY TABLE summary (share INT, weight INT, creditor INT, debtor INT, amount DECIMAL(10,2)); 

INSERT INTO summary (share, weight, creditor, debtor, amount) 
SELECT split.share, split.weight, split.creditor, split.debtor, share.amount 
FROM (split LEFT JOIN share ON split.share = share.id) 
WHERE debtor = 6 OR creditor = 6; 

SELECT summary.share, summary.weight, weightsum.sum, summary.creditor, summary.debtor, summary.amount, ((summary.amount/weightsum.sum) * summary.weight) AS split_amount 
FROM summary LEFT JOIN weightsum 
ON summary.share = weightsum.share; 

Merci pour l'aide .

Répondre

0

Essayez ceci:

SELECT split.share, split.weight, split.creditor, split.debtor, share.amount, wsum.sum 
FROM (
    SELECT split.share, split.weight, split.creditor, split.debtor, share.amount 
    FROM split 
    LEFT JOIN share 
    ON split.share = share.id 
    WHERE debtor = 6 OR creditor = 6 
) As split 
LEFT JOIN (
    SELECT split.share, SUM(weight) AS sum 
    FROM split 
    GROUP BY split.share 
) wsum 
ON split.share = wsum.share; 

Ou plus correctement écrit:

SELECT split.share, split.weight, split.creditor, split.debtor, share.amount, wsum.sum 
FROM split 
LEFT JOIN share 
ON split.share = share.id 
LEFT JOIN (
    SELECT split.share, SUM(weight) AS sum 
    FROM split 
    GROUP BY split.share 
) wsum 
ON split.share = wsum.share 
WHERE split.debtor = 6 OR split.reditor = 6; 
Questions connexes