Пожалуйста, объясните, как выразить этот SQL как единый оператор, используя производные таблицы - PullRequest
1 голос
/ 18 ноября 2010

Для моего собственного руководства я пытаюсь записать эту функциональность SQL в одном выражении без использования временных таблиц. По жизни я не могу заставить запрос работать без MySQL "ОШИБКА 1248 (42000): каждая производная таблица должна иметь свой собственный псевдоним."

Вот что-то похожее, хотя и сломанное, на то, что я хочу:

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;

Спасибо за помощь.

1 Ответ

0 голосов
/ 30 января 2011

Попробуйте это:

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;
...