2013-02-26 3 views
0

У меня есть сценарий ниже, который выдает ошибку во внутреннем запросе. Я использую Sequel Pro, и я только получаю эту ошибку:Неизвестная ошибка внутреннего запроса

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT Savings FROM OfferSuggestionHeader osh LEFT JOIN Projects p ON osh.OfferI' at line 2

Так что я неопределенный, как к тому, что фактический вопрос. Я попытался сделать явное внутреннее соединение внутри внутреннего запроса, если псевдоним p не ссылался/не интерпретировался должным образом или что-то подобное, но это не имело положительного эффекта.

SELECT SUM(osh.Savings) as YTD, 
    SUM (SELECT Savings 
FROM OfferSuggestionHeader osh 
LEFT JOIN Projects p 
ON osh.OfferID = p.offer_id 
WHERE p.uid = 1 AND p.current_status < 3) 
    AS "Open Savings" 
FROM OfferSuggestionHeader osh 
LEFT JOIN Projects p 
    ON p.offer_id = osh.OfferID 
WHERE p.uid = '1' 

Любая помощь приветствуется. Best,

+0

Вы можете применить 'SUM()' к подзапросу? – Tchoupi

+0

Нет, не был уверен! Однако не подумал просто переместить его. Маленькая «Бритва Оккама» ниже сделала трюк! –

ответ

1

Я думаю, что вы можете написать запрос гораздо проще, как:

SELECT SUM(osh.Savings) as YTD, 
     SUM(case when p.current_status < 3 then Savings end) AS "Open Savings" 
FROM OfferSuggestionHeader osh LEFT JOIN 
    Projects p 
    ON p.offer_id = osh.OfferID 
WHERE p.uid = '1' 

То есть, вы можете заменить подзапроса полностью с условным суммированием.

+0

спасибо. У меня было что-то подобное, но когда я говорил с приятелем, который много работает в SQL, он упоминал, что «CASE» тяжелее внутреннего запроса. Это не так, или просто не для MySQL? –

+0

@JohnBlythe. , , Я не могу придумать какое-либо обстоятельство в любой базе данных, с которой я знаком, где подзапрос будет работать лучше, чем эта версия. Вне рук, я даже не могу думать о архитектуре для двигателя, где это было бы возможно. Либо ваш приятель ошибается, либо неправильно его понимает. –

+0

gotcha. просто поговорил с ним снова, и он согласился, что «случай» был бы лучше, если бы я еще больше объяснил ситуацию. Благодаря! –

1

Вы не можете сделать сумму (выберите ....).

попробовать это

SELECT SUM(osh.Savings) as YTD, 
     (SELECT SUM(Savings) 
     FROM OfferSuggestionHeader osh 
     LEFT JOIN Projects p 
     ON osh.OfferID = p.offer_id 
     WHERE p.uid = 1 AND p.current_status < 3) 
AS "Open Savings" 
FROM OfferSuggestionHeader osh 
LEFT JOIN Projects p 
ON p.offer_id = osh.OfferID 
WHERE p.uid = '1' 
1

Похоже, это может быть упрощено с CASE:

SELECT SUM(osh.Savings) as YTD, 
    SUM (CASE WHEN p.current_status < 3 THEN Savings ELSE 0 END) AS "Open Savings" 
FROM OfferSuggestionHeader osh 
    INNER JOIN Projects p 
     ON osh.OfferID = p.offer_id 
WHERE p.uid = 1 

Кроме того, нет необходимости для `LEFT JOIN, так как вы ограничиваете свои результаты с. UID = 1.

+0

не является «CASE» более интенсивным по ресурсам? –

+0

@JohnBlythe - нет, это должно быть вашим самым эффективным решением :) Удачи! Коррелированные подзапросы очень дороги. – sgeddes

+0

интересный. является ли mysql конкретным, или вообще? и можете ли вы рассказать о ресурсных расходах между этими двумя? n00b здесь :) –

1

Проблема в том, что вы выполняете СУММУ над SELECT, а не наоборот. Это должно работать:

SELECT SUM(osh.Savings) as YTD, 
    (SELECT SUM(Savings) 
FROM OfferSuggestionHeader osh 
LEFT JOIN Projects p 
ON osh.OfferID = p.offer_id 
WHERE p.uid = 1 AND p.current_status < 3) 
    AS "Open Savings" 
FROM OfferSuggestionHeader osh 
LEFT JOIN Projects p 
    ON p.offer_id = osh.OfferID 
WHERE p.uid = '1' 
Смежные вопросы