Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Select from join select  [new]
PATRI0T
Member

Откуда: Майкоп
Сообщений: 107
ДОбрый день.
Есть две таблицы
В одной - заказы
Во второй - даты произв. процессов по заказу.

Делаю такой запрос, но 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]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
PATRI0T,

вот это

 where od.order_id = o.id


кто написал внутрь Derived table? Это тебе не LATERAL
4 сен 19, 18:25    [21963797]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
PATRI0T
Member

Откуда: Майкоп
Сообщений: 107
я писал. Увы, Sql только познаю..
Как правильно сделать?
Можно ли вообще такое? Селект из таблицы объединенной с вирт.таблицей?
5 сен 19, 12:19    [21964407]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
PATRI0T,

нет, без LATERAL, который пока не реализован, такой фокус не пройдёт.

Есть 2 варианта решения:
1. Написать ХП с параметром в которой будет твой подзапрос и делать соединения с ней
2. Делать обычный коррелированный подзапрос в select, но он умеет возвращать только скалярное значение, придётся делать ещё один join для вытаскивания оставшихся полей
5 сен 19, 12:29    [21964419]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
PATRI0T
Member

Откуда: Майкоп
Сообщений: 107
т.е. идея была такая

Таблица ORDERS_DATE_PLAN содержит даты производственных операций по участку.
автор
ORDER_ID DATE_DESCRIPTION DATE3
8500 Раскрой МДФ 29.08.2019
8500 Раскрой Шпона 29.08.2019
8500 Колеровка 29.08.2019
8500 Шлиф.Филенок 03.09.2019
8500 Изг. Заготовки Титова 02.09.2019
8500 Сборка 04.09.2019
8500 Станок 06.09.2019
8500 Склад 06.09.2019
8500 Шлифовка 11.09.2019
8500 Лакировка 17.09.2019

8500 Упаковка 18.09.2019

А в главной таблице orders есть поле PLAN_DATE_FRISTSTAGE - дата первого этапа, которая всегда должна быть равной первой дате из таблицы дат. Но почему-то так получилось, что они не равны и я хочу найти где ошибка.
И для этого пытался составить такой запрос, как в начале поста.
т.е. где PLAN_DATE_FRISTSTAGE <>первой DATE3 этого заказа (ORDER ID) из ORDERS_DATE_PLAN
5 сен 19, 12:32    [21964423]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
PATRI0T
Member

Откуда: Майкоп
Сообщений: 107
сочинил такой. такой работает..
Но хочется знать, правильно ли так делать? может есть лучший способ, быстрее итд.
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]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

PATRI0T
Но почему-то так получилось, что они не равны и я хочу найти где ошибка.

Что именно ты хочешь найти? Записи из 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]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
PATRI0T
Member

Откуда: Майкоп
Сообщений: 107
спасибо, все получилось, разобрался.

Вот так все исправлял. Скажите, так правильно?
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]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
PATRI0T,

нет. Такой запрос будет тормозить до посинения
5 сен 19, 13:17    [21964492]     Ответить | Цитировать Сообщить модератору
 Re: Select from join select  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

PATRI0T
Вот так все исправлял. Скажите, так правильно?

Бессмысленно. Если ты просто хотел исправить кривые даты первого этапа (а зачем они вообще
хранятся отдельно?), то достаточно было
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 Ответить