powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Select from join select
10 сообщений из 10, страница 1 из 1
Select from join select
    #39857430
PATRI0T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДОбрый день.
Есть две таблицы
В одной - заказы
Во второй - даты произв. процессов по заказу.

Делаю такой запрос, но IBExpert ругается "Column unknown. O.ID"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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



что не так?
...
Рейтинг: 0 / 0
Select from join select
    #39857433
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PATRI0T,

вот это

Код: sql
1.
 where od.order_id = o.id



кто написал внутрь Derived table? Это тебе не LATERAL
...
Рейтинг: 0 / 0
Select from join select
    #39857834
PATRI0T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я писал. Увы, Sql только познаю..
Как правильно сделать?
Можно ли вообще такое? Селект из таблицы объединенной с вирт.таблицей?
...
Рейтинг: 0 / 0
Select from join select
    #39857838
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PATRI0T,

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

Есть 2 варианта решения:
1. Написать ХП с параметром в которой будет твой подзапрос и делать соединения с ней
2. Делать обычный коррелированный подзапрос в select, но он умеет возвращать только скалярное значение, придётся делать ещё один join для вытаскивания оставшихся полей
...
Рейтинг: 0 / 0
Select from join select
    #39857841
PATRI0T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. идея была такая

Таблица 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
...
Рейтинг: 0 / 0
Select from join select
    #39857848
PATRI0T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сочинил такой. такой работает..
Но хочется знать, правильно ли так делать? может есть лучший способ, быстрее итд.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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
...
Рейтинг: 0 / 0
Select from join select
    #39857857
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PATRI0TНо почему-то так получилось, что они не равны и я хочу найти где ошибка.

Что именно ты хочешь найти? Записи из orders у которых дата - не первая в списке? Ну так и
пиши:
Код: sql
1.
2.
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
...
Рейтинг: 0 / 0
Select from join select
    #39857876
PATRI0T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, все получилось, разобрался.

Вот так все исправлял. Скажите, так правильно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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)
...
Рейтинг: 0 / 0
Select from join select
    #39857881
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PATRI0T,

нет. Такой запрос будет тормозить до посинения
...
Рейтинг: 0 / 0
Select from join select
    #39857896
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PATRI0TВот так все исправлял. Скажите, так правильно?

Бессмысленно. Если ты просто хотел исправить кривые даты первого этапа (а зачем они вообще
хранятся отдельно?), то достаточно было
Код: sql
1.
2.
update orders set plan_date_firststage = (select min(date3) from orders_date_plan 
where order_id = id)


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Select from join select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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