Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Firebird, InterBase |
![]() ![]() |
PATRI0T Member Откуда: Майкоп Сообщений: 132 |
ДОбрый день. Есть две таблицы В одной - заказы Во второй - даты произв. процессов по заказу. Делаю такой запрос, но IBExpert ругается "Column unknown. O.ID" select o.id, o.itm_ordernum, o.plan_date_firststage, lj.date3 from orders o left join ( select first 1 od.order_id, od.date3 from orders_date_plan od where od.order_id = o.id order by od.id asc) as lj on lj.order_id=o.id Where lj.date3 <> o.plan_date_firststage что не так? |
4 сен 19, 18:20 [21963792] Ответить | Цитировать Сообщить модератору |
Симонов Денис Member Откуда: Рязань Сообщений: 10796 |
PATRI0T, вот это where od.order_id = o.id кто написал внутрь Derived table? Это тебе не LATERAL |
4 сен 19, 18:25 [21963797] Ответить | Цитировать Сообщить модератору |
PATRI0T Member Откуда: Майкоп Сообщений: 132 |
я писал. Увы, Sql только познаю.. Как правильно сделать? Можно ли вообще такое? Селект из таблицы объединенной с вирт.таблицей? |
5 сен 19, 12:19 [21964407] Ответить | Цитировать Сообщить модератору |
Симонов Денис Member Откуда: Рязань Сообщений: 10796 |
PATRI0T, нет, без LATERAL, который пока не реализован, такой фокус не пройдёт. Есть 2 варианта решения: 1. Написать ХП с параметром в которой будет твой подзапрос и делать соединения с ней 2. Делать обычный коррелированный подзапрос в select, но он умеет возвращать только скалярное значение, придётся делать ещё один join для вытаскивания оставшихся полей |
5 сен 19, 12:29 [21964419] Ответить | Цитировать Сообщить модератору |
PATRI0T Member Откуда: Майкоп Сообщений: 132 |
т.е. идея была такая Таблица ORDERS_DATE_PLAN содержит даты производственных операций по участку.
8500 Упаковка 18.09.2019 А в главной таблице orders есть поле PLAN_DATE_FRISTSTAGE - дата первого этапа, которая всегда должна быть равной первой дате из таблицы дат. Но почему-то так получилось, что они не равны и я хочу найти где ошибка. И для этого пытался составить такой запрос, как в начале поста. т.е. где PLAN_DATE_FRISTSTAGE <>первой DATE3 этого заказа (ORDER ID) из ORDERS_DATE_PLAN |
||
5 сен 19, 12:32 [21964423] Ответить | Цитировать Сообщить модератору |
PATRI0T Member Откуда: Майкоп Сообщений: 132 |
сочинил такой. такой работает.. Но хочется знать, правильно ли так делать? может есть лучший способ, быстрее итд. select * from (select o.id, o.itm_ordernum, o.plan_date_firststage, (select first 1 od.date3 from orders_date_plan od where od.order_id = o.id order by od.id asc) as plan_date from orders o where o.id > 7000) SF where sf.plan_date<>sf.plan_date_firststage |
5 сен 19, 12:36 [21964431] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52473 |
Что именно ты хочешь найти? Записи из orders у которых дата - не первая в списке? Ну так и пиши: select * from orders where exists (select * from ORDERS_DATE_PLAN where orders.PLAN_DATE_FRISTSTAGE > ORDERS_DATE_PLAN.DATE3) Posted via ActualForum NNTP Server 1.5 |
||
5 сен 19, 12:46 [21964445] Ответить | Цитировать Сообщить модератору |
PATRI0T Member Откуда: Майкоп Сообщений: 132 |
спасибо, все получилось, разобрался. Вот так все исправлял. Скажите, так правильно? update orders o set o.plan_date_firststage = (select first 1 od.date3 from orders_date_plan od where od.order_id = o.id order by od.id asc) where o.id in (select vt.id from (select o.id, o.itm_ordernum, o.plan_date_firststage, (select first 1 od.date3 from orders_date_plan od where od.order_id = o.id order by od.id asc) as plan_date from orders o where o.id > 7000) as vt where vt.plan_date_firststage <> vt.plan_date) |
5 сен 19, 13:12 [21964481] Ответить | Цитировать Сообщить модератору |
Симонов Денис Member Откуда: Рязань Сообщений: 10796 |
PATRI0T, нет. Такой запрос будет тормозить до посинения |
5 сен 19, 13:17 [21964492] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52473 |
Бессмысленно. Если ты просто хотел исправить кривые даты первого этапа (а зачем они вообще хранятся отдельно?), то достаточно было update orders set plan_date_firststage = (select min(date3) from orders_date_plan where order_id = id) Posted via ActualForum NNTP Server 1.5 |
||
5 сен 19, 13:38 [21964529] Ответить | Цитировать Сообщить модератору |
Все форумы / Firebird, InterBase | ![]() |