Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Внутренний скалярный запрос не видит алиас внешнего запроса / 4 сообщений из 4, страница 1 из 1
02.06.2017, 15:11
    #39464757
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренний скалярный запрос не видит алиас внешнего запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SELECT i.id ,
 
(SELECT SUM(sum_rub) FROM ( 
  (SELECT iwn.sum_rub
  FROM invoicing_working_norm iwn 
  INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id
  INNER JOIN rate_timeline rt ON rt.id = cwnr.rate_timeline_id 
  INNER JOIN additional_service a1 ON a1.id = cwnr.service_id 
  INNER JOIN contract_cargo_head cch ON cch.id = rt.contract_cargo_head_id 
  INNER JOIN contract c1 ON c1.id = cch.contract_id 
  WHERE iwn.invoicing_id = i.id) 
  UNION 
  (SELECT e.sum_rub
  FROM invoicing_additional_service_editing e
  INNER JOIN additional_service a ON a.id = e.service_id
  INNER JOIN report_code rc ON rc.id = a.report_code_id 
  WHERE e.invoicing_id = i.id
  AND rc.report_code_name = 'Перегрузка') 
  )iq ) AS transshipment_sum
  
FROM invoicing i 
LEFT JOIN invoice_type it ON it.id = i.invoice_type_id 
INNER JOIN contract c ON c.id = i.contract_id 
INNER JOIN contragent cown ON cown.id = c.contragent_id 
LEFT JOIN vessel v ON v.id = i.vessel_id 
LEFT JOIN cargo_zone cz ON cz.id = i.cargo_zone_id 
WHERE c.cargo_status = 'import' 
AND NOT(UPPER(it.invoice_type_name) LIKE UPPER('АВАНС%')) 


Во внутреннем запросе идет объединение двух подзапросов, и оба они ссылаются на i.id.
Выдает ошибку авторUnknown column 'i.id' in 'where clause'
Если брать вместо объединения двух подзапросов просто один запрос, без второго SELECT, вычисляющего их сумму, то все выдает нормально. Проблема появляется когда обрамляешь эти два подзапроса третьим внешним селектом (SELECT SUM(sum_rub) FROM (
Внутренние запросы перестают видеть алиас i.
Как выйти из положения?
...
Рейтинг: 0 / 0
02.06.2017, 15:27
    #39464789
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренний скалярный запрос не видит алиас внешнего запроса
Вот так вышел из положения, корректно? Вместо UNION сделал +, и COALESCE во избежание NULL-ов. Таким образом избавляемся от многоуровневости.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT i.id ,
 
  ((SELECT COALESCE(SUM(iwn.sum_rub), 0)
  FROM invoicing_working_norm iwn 
  INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id
  INNER JOIN rate_timeline rt ON rt.id = cwnr.rate_timeline_id 
  INNER JOIN additional_service a1 ON a1.id = cwnr.service_id 
  INNER JOIN contract_cargo_head cch ON cch.id = rt.contract_cargo_head_id 
  INNER JOIN contract c1 ON c1.id = cch.contract_id 
  WHERE iwn.invoicing_id = i.id) 
  +
  (SELECT COALESCE(SUM(e.sum_rub), 0)
  FROM invoicing_additional_service_editing e
  INNER JOIN additional_service a ON a.id = e.service_id
  INNER JOIN report_code rc ON rc.id = a.report_code_id 
  WHERE e.invoicing_id = i.id
  AND rc.report_code_name = 'Перегрузка') 
  ) AS transshipment_sum
  
FROM invoicing i 
LEFT JOIN invoice_type it ON it.id = i.invoice_type_id 
INNER JOIN contract c ON c.id = i.contract_id 
INNER JOIN contragent cown ON cown.id = c.contragent_id 
LEFT JOIN vessel v ON v.id = i.vessel_id 
LEFT JOIN cargo_zone cz ON cz.id = i.cargo_zone_id 
WHERE c.cargo_status = 'import' 
AND NOT(UPPER(it.invoice_type_name) LIKE UPPER('АВАНС%')) 
...
Рейтинг: 0 / 0
29.06.2017, 14:31
    #39479698
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренний скалярный запрос не видит алиас внешнего запроса
В продолжении темы.
Сказалась одна неприятная особенность. Когда один из подзапросов не возвращает строки, его результат выглядит как NULL, не смотря на то, что внутри него стоит COALESCE. И это приводит к тому что при суммировании с ненулевым результатом другого запроса общая сумма получается NULL. Как обойти это ограничение?
...
Рейтинг: 0 / 0
29.06.2017, 23:35
    #39480026
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренний скалярный запрос не видит алиас внешнего запроса
svnvlad,

....ну оберните еше раз в ISNULL...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Внутренний скалярный запрос не видит алиас внешнего запроса / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]