Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Свести запросы из нескольких таблиц в одну / 25 сообщений из 29, страница 1 из 2
25.10.2018, 09:24
    #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
25.10.2018, 09:25
    #39722620
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_is,

union all

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

join тут не канает вообще.
...
Рейтинг: 0 / 0
25.10.2018, 09:26
    #39722622
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
я вообще не понял чего хочет автор
...
Рейтинг: 0 / 0
25.10.2018, 09:54
    #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
25.10.2018, 09:58
    #39722639
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_is,

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

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

В общем, либо union all, либо никак.
В производстве учавствуют продукты разных тех. категорий. Для каждой тех. категории я сделал справочную таблицу (уже понимаю, что неправ, только не понимаю в чем). Как можно пользоваться ОДНОЙ справочной таблицей не знаю. Я не волшебник, я только учусь (с)
...
Рейтинг: 0 / 0
25.10.2018, 10:19
    #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
25.10.2018, 10:20
    #39722657
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_is,

категории можно разделить дополнительным полем, которое ссылается на справочник категорий
...
Рейтинг: 0 / 0
25.10.2018, 10:31
    #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
25.10.2018, 10:38
    #39722664
my_nik_name_is
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
Симонов Денисmy_nik_name_is,

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

ну наверное. Смысл такой. Каждый материал состоит из других материалов.
Тебе лучше знать, я не владею знаниями о вашем бизнес-процессе.
Только подкинул идею, не более того.
...
Рейтинг: 0 / 0
25.10.2018, 12:24
    #39722743
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_is<...> Буду дальше пытаться с одной справочной таблицей(это же все данные уже внесенные надо заново вноситьв новую таблицу! ужас!)
Этого ужаса тоже можно избежать, перенеся данные из одной таблицы в другую соответствующим запросом.
...
Рейтинг: 0 / 0
26.10.2018, 12:56
    #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
26.10.2018, 13:02
    #39723447
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_isПочему?

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

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

надо было к алиасу CTE, а именно r, обращаться в рекурсии вместо t4
...
Рейтинг: 0 / 0
26.10.2018, 13:34
    #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
26.10.2018, 16:02
    #39723611
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_is,

потому что ты не внимательно смотрел мой пример. Там join алиаса CTE с таблицей во второй части union all
...
Рейтинг: 0 / 0
27.10.2018, 21:30
    #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
27.10.2018, 21:41
    #39723944
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
my_nik_name_is,

ну запрос то надо нормально форматировать, чтобы читать было проще.
1. Сходу косяка в логике не видно, чтобы было видно надо бы ещё и res выводить, тогда будет видно что к чему присоединяется
2. level ты считаешь не верно. надо было r.lvl + 1 as lvl
...
Рейтинг: 0 / 0
27.10.2018, 21:45
    #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
28.10.2018, 06:43
    #39723989
my_nik_name_is
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свести запросы из нескольких таблиц в одну
Симонов Денис,

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

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

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


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