2010-11-18 14 views
1

對於我自己的啓示,我試圖在不使用臨時表的情況下將此SQL功能寫入單個語句中。對於我來說,如果沒有得到MySQL,我無法讓查詢工作「錯誤1248(42000):每個派生表都必須有自己的別名。」請解釋如何使用派生表將此SQL作爲單個語句表示

這裏的東西類似,雖然壞了,給我想要的東西:

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; 

這裏是我嘗試使用臨時表表示的工作版本:

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; 

感謝您的幫助。

回答

0

試試這個:

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; 

或者更正確地寫入:

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;