Почему дублируется запись ?

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:19:31
Простите, Не понял как решить проблему ...
olegt2009
Дата: 23.01.2013 17:24:57
Вроде связка z1.add_date = z2.max_date должна решать эту проблему ?
Akina
Дата: 23.01.2013 17:32:21
Akina
Подзапрос, имеющий алиас z3, возвращает две записи, имеющие в поле, по которому выполняется связывание с внешним запросом, значение 10.
ЭТО понятно?
Если понятно - то ответьте на такой вопрос: "Это правильно или нет?".
Если правильно - то и две строки в конечном результате правильно.
Если нет - приводите подзапрос в соответствие с логикой получения результата.
olegt2009
Дата: 23.01.2013 17:39:54
Я писал в задаче что две записи неправильно
А как решить проблему пока не понимаю
olegt2009
Дата: 23.01.2013 17:44:01
Т.е. я не понимаю почему
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 - тоже. При написании преследовалась цель получить некий промежуточный результат. Некие промежуточные данные.

Сейчас запрос, получающий эти промежуточные данные, возвращает две записи. Это неправильно? переделывайте его.
olegt2009
Дата: 23.01.2013 18:28:33
Весь вопрос как ? У меня к сожалению идей нет ...