powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Свести запросы из нескольких таблиц в одну
25 сообщений из 29, страница 1 из 2
Свести запросы из нескольких таблиц в одну
    #39722619
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Есть справочная таблица MATERIALS:
ID INTEGER PRIMARY KEY,
NAME VARCHAR(20)

Есть еще несколько справочных таблиц(6) с одинаковой структурой:
ID INTEGER PRIMARY KEY,
OUT INTEGER FK MATERIALS(ID) - Получаемый продукт,
RES INTEGER FK MATERIALS(ID) - индекс продукта, необходимый для изготовления данного
QTY INTEGER - кол-во продукта, необходимое для изготовления данного

Можно ли сделать такой запрос, чтобы получить данные из всех 6 таблиц сразу?
Я пробовал использовать join(select t4.res, t4.qty from t4_info t4 join t3_info t3 on t4.res = t3.out join t1_info t1 on t1.out=t4.res where t4.out=78;) получаю 1 запись с полями null.
Да, Использую firebird 3
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722620
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

union all

select ...
union all
select ...
union all
select ...

join тут не канает вообще.
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722622
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вообще не понял чего хочет автор
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722636
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvmy_nik_name_is,

union all

select ...
union all
select ...
union all
select ...

join тут не канает вообще.
Я, видимо, не совсем правильно выразил проблему. Попробовал union all и получил все записи из всех таблиц. Мне нужны записи только по определенному критерию: в таблице "т4" есть запись:
OUT-76

RES-66

QTY-6[/li]
Поое RES ссылается на таблицу t3_info(out). В ней поле res ссылается на таблицу t2_info(out) b т.д. Мне надо написать запрос, который будет сводить цепочку данных из всех справочных таблиц в одну. В запросе с join в конце же есть указание: "where t4.out=78".
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722639
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

переделай структуру так чтобы у тебя вместо 6 таблиц была одна, и пользуйся рекурсивным запросом, будет тебе цепочка.
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722642
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_isМне надо написать запрос, который будет сводить цепочку данных из всех справочных таблиц в одну.
из таблиц "с одинаковой структурой" данные можно объединить только через union all.
join можно было бы делать если бы справочная таблица была ОДНА.
my_nik_name_isМне нужны записи только по определенному критерию: в таблице "т4" есть запись
тогда join надо делать с одной таблицей Т4, и я не понял, зачем вам получать данные из 6 таблиц сразу.

В общем, либо union all, либо никак.
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722643
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,
Друг, вот честно, если бы я все это знал, то и не спрашивал бы здесь помощи. Подскажи, плиз, как мне переделать структуру?
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722646
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvmy_nik_name_isМне надо написать запрос, который будет сводить цепочку данных из всех справочных таблиц в одну.
из таблиц "с одинаковой структурой" данные можно объединить только через union all.
join можно было бы делать если бы справочная таблица была ОДНА.
my_nik_name_isМне нужны записи только по определенному критерию: в таблице "т4" есть запись
тогда join надо делать с одной таблицей Т4, и я не понял, зачем вам получать данные из 6 таблиц сразу.

В общем, либо union all, либо никак.
В производстве учавствуют продукты разных тех. категорий. Для каждой тех. категории я сделал справочную таблицу (уже понимаю, что неправ, только не понимаю в чем). Как можно пользоваться ОДНОЙ справочной таблицей не знаю. Я не волшебник, я только учусь (с)
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722655
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

да чего тут не понятного. раз в таблицах хранятся одинаковые по смыслу данные, да ещё и у них структура одинаковая значит это одна таблица. А запрос в этом случае превращается в такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create table materal (
  id int not null primary key,
  name varchar(50) not null
);


create table consist (
  id int not null primary key,
  material_id int not null,
  consist_id int,
  cnt numeric(18, 3)
);

with recursive r as (
  select
    id,
    material_id,
    consist_id,
    cnt,
    0 a lvl
  from consist
  where id = 78
  union all
  select
    consist.id,
    consist.material_id,
    consist.consist_id,
    consist.cnt,
    r.lvl a lvl
  from r join consist on consist.id = r.consist_id
  where r.lvl < 1000
)
select
  material.name,
  r.id,
  r.material_id,
  r.consist_id,
  r.cnt,
  r.lvl
from r
join materal



для завтраки, дальше сам
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722657
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

категории можно разделить дополнительным полем, которое ссылается на справочник категорий
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722661
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисmy_nik_name_is,

да чего тут не понятного. раз в таблицах хранятся одинаковые по смыслу данные, да ещё и у них структура одинаковая значит это одна таблица. А запрос в этом случае превращается в такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create table materal (
  id int not null primary key,
  name varchar(50) not null
);


create table consist (
  id int not null primary key,
  material_id int not null,
  consist_id int,
  cnt numeric(18, 3)
);

with recursive r as (
  select
    id,
    material_id,
    consist_id,
    cnt,
    0 a lvl
  from consist
  where id = 78
  union all
  select
    consist.id,
    consist.material_id,
    consist.consist_id,
    consist.cnt,
    r.lvl a lvl
  from r join consist on consist.id = r.consist_id
  where r.lvl < 1000
)
select
  material.name,
  r.id,
  r.material_id,
  r.consist_id,
  r.cnt,
  r.lvl
from r
join materal



для завтраки, дальше сам
О как! Не буду врать, что все сразу понял. Но примерно уяснил, как все справочные таблицы можно свести в одну (думал об этом, когда проектировал БД, но счел лучшим вариантом: своя таблица для каждой тех. категории). Спасибо! Голова моя, после 2-го инсульта, соображает очень медленно и плохо, да и sql для меня внове. Буду дальше пытаться с одной справочной таблицей(это же все данные уже внесенные надо заново вноситьв новую таблицу! ужас!)
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722664
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисmy_nik_name_is,

категории можно разделить дополнительным полем, которое ссылается на справочник категорий
В твоем примере это поле "consist_id" , правильно?
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722671
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

ну наверное. Смысл такой. Каждый материал состоит из других материалов.
Тебе лучше знать, я не владею знаниями о вашем бизнес-процессе.
Только подкинул идею, не более того.
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39722743
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is<...> Буду дальше пытаться с одной справочной таблицей(это же все данные уже внесенные надо заново вноситьв новую таблицу! ужас!)
Этого ужаса тоже можно избежать, перенеся данные из одной таблицы в другую соответствующим запросом.
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723440
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, друзья!
Vlad F,
Спасибо за совет,в итоге я до этого додумался тоже. Ок. Я совместил данные из 6-ти справочных таблиц в одну: почитал про recursive и попробовал написать рекурсивный запрос:
Код: sql
1.
2.
3.
with recursive r as
(select t4.res, t4.qty from schema_info t4 where t4.out=78 union all
select t3.res, t3.qty from schema_info t3 where t3.out=t4.res) select * from r;


При выполнении запроса получаю ошибку: "SQL error code = -206.
Column unknown.
T4.RES." Почему? Когда в IBExpert пишу запрос, то после t4. срабатывает подстановка и появляется список доступных полей и в нем поле res есть, и в первом запросе работает "t4.out=78", а при выполнении запроса после union поле неизвестно...
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723447
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_isПочему?

Потому что в этом select в части from отсутствует t4.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723458
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovПотому что в этом select в части from отсутствует t4.

Ясно. А можно как-то указать, что мне нужны записи, удовлетворяющие условиям из предыдущего запроса?
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723477
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

надо было к алиасу CTE, а именно r, обращаться в рекурсии вместо t4
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723494
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Код: sql
1.
2.
3.
4.
with recursive r as
(select res, qty from schema_info t4 where t4.out=78 union all
select res, qty from schema_info t3 where t3.res=r.out
) select * from r;


Менял t3 на r - результат нулевой: на алиас "r" также ругается, что неизвестный. Что-то я не так понимаю, похоже. Либо вообще не понимаю...
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723611
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

потому что ты не внимательно смотрел мой пример. Там join алиаса CTE с таблицей во второй части union all
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723941
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Попытался адаптировать твой пример к своей БД:
Код: sql
1.
2.
3.
4.
with recursive r as(
select id, out, tier, qty, 0 as lvl from schema_info where out = 78 union all
select schema_info.id, schema_info.out, schema_info.tier, schema_info.qty, r.tier as lvl
from r join schema_info on schema_info.res=r.out) select * from r;


В результате получаю 3 строки где "out = 78", т.е даже намека на "union all" нет

Допустим, у нас есть такая таблица materials, в которой хранятся названия всех ресурсов:
ID INTEGER NOT NULL PK,

NAME VARCHAR(20),

TIER INTEGER - тех. категория ресурса

Также есть справочная таблица schema_info, в которой хранятся записи, какой ресурс для чего используется:

ID INTEGER NOT NULL PK,

OUT INTEGER, - ид готового ресурса

RES INTEGER, - ид ресурса, нужного для изготовления нового ресурса
примерно так у меня выглядят эти таблицы. Попытка адаптировать твой пример оказалась неудачной. В чем моя ошибка?
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723944
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

ну запрос то надо нормально форматировать, чтобы читать было проще.
1. Сходу косяка в логике не видно, чтобы было видно надо бы ещё и res выводить, тогда будет видно что к чему присоединяется
2. level ты считаешь не верно. надо было r.lvl + 1 as lvl
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723947
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

а всё теперь вижу. Надо было вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with recursive r as(
  select id, out, res, tier, qty, 0 as lvl 
  from schema_info 
  where out = 78 
  union all
  select i.id, i.out, i.res,  i.tier, i.qty, r.lvl + 1 as lvl
  from r join schema_info i on i.out=r.res
) 
select * from r;
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39723989
my_nik_name_is
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Где-то кроется ошибка. 1025 записей получаю в результате. И записей, где out=78, должно быть 3, мне кажется, а она всего одна

[img=]
...
Рейтинг: 0 / 0
Свести запросы из нескольких таблиц в одну
    #39724015
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
my_nik_name_is,

ну так какого у тебя out = res
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Свести запросы из нескольких таблиц в одну
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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