olegt2009
Дата: 23.01.2013 16:47:33
Коллеги, помогите разобраться. Уже всю голову сломал ...
Не могу понять почему дублируется запись.
Требуется вывесьти ВСЕ записи из таблицы consolidated_actions (без дублирования) и записи из таблицы consolidated_action_plan_for_period с полями
ukraine_budget, crimea_budget, local_budget, other_budget, achieved_result
где
consolidated_actions.consolidated_action_id = consolidated_action_plan_for_period.consolidated_action_id
ВАЖНО _одну запись с максимальной_ consolidated_action_plan_for_period.add_date < '2013-01-23'
consolidated_action_plan_for_period.report_moment_id = 4
consolidated_action_plan_for_period.is_changes_approved_by_resolution = 1
для сверки
для consolidated_action_plan_for_period.consolidated_action_id = 12 значения ukraine_budget, crimea_budget, local_budget, other_budget 11,22,33,44
для consolidated_action_plan_for_period.consolidated_action_id = 27 значения ukraine_budget, crimea_budget, local_budget, other_budget 11,11,11,11
Все вроде хорошо, запрос ниже нормально работает но выдает запись 10 2 раза ...
Как этого избежать ?
Таблички присоединены.
-----------------------
SELECT
consolidated_actions.consolidated_action_id,
ukraine_budget AS ukraine_budget,
crimea_budget AS crimea_budget,
local_budget AS local_budget,
other_budget AS other_budget
FROM
consolidated_actions
LEFT JOIN
(SELECT z1.consolidated_action_plan_for_period_id,
z1.consolidated_action_id,
ukraine_budget,
crimea_budget,
local_budget,
other_budget,
achieved_result
FROM consolidated_action_plan_for_period z1,
(SELECT consolidated_action_plan_for_period_id,
consolidated_action_id,
MAX(add_date) max_date
FROM consolidated_action_plan_for_period
WHERE add_date < '2013-01-23'
GROUP BY consolidated_action_id) z2
WHERE z1.add_date = z2.max_date
AND z1.report_moment_id = 4
AND z1.is_changes_approved_by_resolution = 1
AND z1.consolidated_action_id IS NOT NULL) z3
ON z3.consolidated_action_id =
consolidated_actions.consolidated_action_id
WHERE ((consolidated_actions.is_to_archive IS NULL
OR consolidated_actions.is_to_archive = 0))
Akina
Дата: 23.01.2013 17:16:36
Подзапрос, имеющий алиас z3, возвращает две записи, имеющие в поле, по которому выполняется связывание с внешним запросом, значение 10.
Причина станет видна, если выполнить запрос
select distinct
consolidated_action_id
, add_date
from
consolidated_action_plan_for_period
where
add_date < '2013-01-23'
order by
consolidated_action_id
, add_date;
olegt2009
Дата: 23.01.2013 17:44:58
запрос
SELECT z1.consolidated_action_plan_for_period_id,
z1.consolidated_action_id,
ukraine_budget,
crimea_budget,
local_budget,
other_budget,
achieved_result
FROM consolidated_action_plan_for_period z1,
(SELECT consolidated_action_plan_for_period_id,
consolidated_action_id,
MAX(add_date) max_date
FROM consolidated_action_plan_for_period
WHERE add_date < '2013-01-23'
GROUP BY consolidated_action_id) z2
WHERE z1.add_date = z2.max_date
AND z1.report_moment_id = 4
AND z1.is_changes_approved_by_resolution = 1
AND z1.consolidated_action_id IS NOT NULL
возвращает две строки с consolidated_action_id = 10
Akina
Дата: 23.01.2013 18:02:15
ОБ этом я говорил на полчаса раньше. Так что - не новость.
Вы писАли запрос. Соответственно, и подзапрос z3 - тоже. При написании преследовалась цель получить некий промежуточный результат. Некие промежуточные данные.
Сейчас запрос, получающий эти промежуточные данные, возвращает две записи. Это неправильно? переделывайте его.