2010-11-18 3 views
1

Für meine eigene Erbauung, ich versuche, diese SQL-Funktionalität in einer einzigen Anweisung zu schreiben, ohne temporäre Tabellen zu verwenden. Für das Leben von mir kann ich die Abfrage nicht funktionieren, ohne einen MySQL "ERROR 1248 (42000) zu bekommen: Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben."Bitte erklären Sie, wie Sie diese SQL als einzelne Anweisung mit abgeleiteten Tabellen ausdrücken können

Hier ist etwas ähnlich, wenn auch gebrochen, zu dem, was ich will:

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; 

Hier ist eine funktionierende Version von dem, was ich versuche, temporäre Tabellen zu exprimierenden mit:

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; 

Danke für die Hilfe .

Antwort

0

Versuchen Sie folgendes:

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; 

oder richtiger geschrieben:

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; 
Verwandte Themen