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

Откуда:
Сообщений: 70
Здравствуйте,
не могли бы вы помочь ?
есть две таблицы Table_S и Table_I
Тестовые данные для Table_S:
ID_S S_NAME
1 name_1
2 name_2
3 name_3
4 name_4
5 name_5

Тестовые данные для Table_I:
ID_I ID_S I_TEMP I_TIME
1 1 20,1 19.06.2018 10:26
2 2 20,2 19.06.2018 10:36
3 3 20,5 19.06.2018 10:46
4 4 21,5 19.06.2018 10:56
5 5 19,4 19.06.2018 11:06
6 1 20,8 19.06.2018 20:26
7 2 21,2 19.06.2018 20:36
8 3 19,5 19.06.2018 20:46
9 4 20,5 19.06.2018 20:56
10 5 19,9 19.06.2018 31:06
11 1 21,8 19.06.2018 30:26
12 2 20,8 19.06.2018 30:36
13 3 20,5 19.06.2018 30:46
14 4 21,3 19.06.2018 30:56
15 5 20,6 19.06.2018 31:06

Table_S связан с Table_I по полю ID_S

Необходимо сделать выборку Table_I.ID_S, Table_I.I_TEMP, Table_S.S_NAME и максимальное время Table_I.I_TIME, т.е.
должно получится что-то вроде такого
1 21,8 name_1 19.06.2018 30:26
2 20,8 name_2 19.06.2018 30:36
3 20,5 name_3 19.06.2018 30:46
4 21,3 name_4 19.06.2018 30:56
5 20,6 name_5 19.06.2018 31:06

Пробовал такой запрос делать, но он много id_s выводит
SELECT itest.ID_S, itest.I_TEMP, scond.S_NAME,
max(itest.I_TIME)
from Table_S scond inner join Table_I itest
on itest.id_s=scond.id_s group by 1,2,3
10 апр 19, 09:34    [21857959]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1335
Serega325
Здравствуйте,
не могли бы вы помочь ?
есть две таблицы Table_S и Table_I
Тестовые данные для Table_S:
ID_S    S_NAME  
1 name_1
2 name_2
3 name_3
4 name_4
5 name_5
Тестовые данные для Table_I:
ID_I    ID_S     I_TEMP               I_TIME
1 1 20,1 19.06.2018 10:26
2 2 20,2 19.06.2018 10:36
3 3 20,5 19.06.2018 10:46
4 4 21,5 19.06.2018 10:56
5 5 19,4 19.06.2018 11:06
6 1 20,8 19.06.2018 20:26
7 2 21,2 19.06.2018 20:36
8 3 19,5 19.06.2018 20:46
9 4 20,5 19.06.2018 20:56
10 5 19,9 19.06.2018 31:06
11 1 21,8 19.06.2018 30:26
12 2 20,8 19.06.2018 30:36
13 3 20,5 19.06.2018 30:46
14 4 21,3 19.06.2018 30:56
15 5 20,6 19.06.2018 31:06
Table_S связан с Table_I по полю ID_S

Необходимо сделать выборку Table_I.ID_S, Table_I.I_TEMP, Table_S.S_NAME и максимальное время Table_I.I_TIME, т.е.
должно получится что-то вроде такого
1           21,8   name_1      19.06.2018 30:26
2 20,8 name_2 19.06.2018 30:36
3 20,5 name_3 19.06.2018 30:46
4 21,3 name_4 19.06.2018 30:56
5 20,6 name_5 19.06.2018 31:06
Пробовал такой запрос делать, но он много id_s выводит
SELECT itest.ID_S, itest.I_TEMP, scond.S_NAME,
max(itest.I_TIME)
from Table_S scond inner join Table_I itest
on itest.id_s=scond.id_s  group by 1,2,3



Получил ровно то что написал в условии
"Необходимо сделать выборку Table_I.ID_S, Table_I.I_TEMP, Table_S.S_NAME и максимальное время Table_I.I_TIME"
то то что написано ниже (желаемое)
1           21,8   name_1      19.06.2018 30:26
2 20,8 name_2 19.06.2018 30:36
3 20,5 name_3 19.06.2018 30:46
4 21,3 name_4 19.06.2018 30:56
5 20,6 name_5 19.06.2018 31:06
как-то противоречит условию

Ну и чтобы получилось желаемое надо по другому выбирать I_TEMP (максимальное, минимальное, первое попавшееся, .....)
10 апр 19, 11:03    [21858075]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 689
Serega325,

версия ФБ неизвестна? Оконные функции не предлагать?
10 апр 19, 11:12    [21858083]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Serega325
Member

Откуда:
Сообщений: 70
KreatorXXI
Serega325,

версия ФБ неизвестна? Оконные функции не предлагать?

Версия 2.5
10 апр 19, 15:31    [21858438]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Serega325
Member

Откуда:
Сообщений: 70
Надо выводить I_TEMP с максимальным временем
m7m
Serega325
Здравствуйте,
не могли бы вы помочь ?
есть две таблицы Table_S и Table_I
Тестовые данные для Table_S:
ID_S    S_NAME  
1 name_1
2 name_2
3 name_3
4 name_4
5 name_5
Тестовые данные для Table_I:
ID_I    ID_S     I_TEMP               I_TIME
1 1 20,1 19.06.2018 10:26
2 2 20,2 19.06.2018 10:36
3 3 20,5 19.06.2018 10:46
4 4 21,5 19.06.2018 10:56
5 5 19,4 19.06.2018 11:06
6 1 20,8 19.06.2018 20:26
7 2 21,2 19.06.2018 20:36
8 3 19,5 19.06.2018 20:46
9 4 20,5 19.06.2018 20:56
10 5 19,9 19.06.2018 31:06
11 1 21,8 19.06.2018 30:26
12 2 20,8 19.06.2018 30:36
13 3 20,5 19.06.2018 30:46
14 4 21,3 19.06.2018 30:56
15 5 20,6 19.06.2018 31:06
Table_S связан с Table_I по полю ID_S

Необходимо сделать выборку Table_I.ID_S, Table_I.I_TEMP, Table_S.S_NAME и максимальное время Table_I.I_TIME, т.е.
должно получится что-то вроде такого
1           21,8   name_1      19.06.2018 30:26
2 20,8 name_2 19.06.2018 30:36
3 20,5 name_3 19.06.2018 30:46
4 21,3 name_4 19.06.2018 30:56
5 20,6 name_5 19.06.2018 31:06
Пробовал такой запрос делать, но он много id_s выводит
SELECT itest.ID_S, itest.I_TEMP, scond.S_NAME,
max(itest.I_TIME)
from Table_S scond inner join Table_I itest
on itest.id_s=scond.id_s  group by 1,2,3



Получил ровно то что написал в условии
"Необходимо сделать выборку Table_I.ID_S, Table_I.I_TEMP, Table_S.S_NAME и максимальное время Table_I.I_TIME"
то то что написано ниже (желаемое)
1           21,8   name_1      19.06.2018 30:26
2 20,8 name_2 19.06.2018 30:36
3 20,5 name_3 19.06.2018 30:46
4 21,3 name_4 19.06.2018 30:56
5 20,6 name_5 19.06.2018 31:06
как-то противоречит условию

Ну и чтобы получилось желаемое надо по другому выбирать I_TEMP (максимальное, минимальное, первое попавшееся, .....)
10 апр 19, 15:32    [21858439]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Serega325
Member

Откуда:
Сообщений: 70
KreatorXXI
Serega325,

версия ФБ неизвестна? Оконные функции не предлагать?

только select запрос
10 апр 19, 15:33    [21858440]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1335
Serega325,

Посмотри вот здесь Выбор максимальных значений
там должно быть то что тебе нужно, ну я так думаю
10 апр 19, 15:44    [21858466]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 689
Serega325,

что-то мне сдаётся, что приведённый Вами запрос правильный. Что не так в результате?
10 апр 19, 16:21    [21858547]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1335
KreatorXXI
Serega325,

что-то мне сдаётся, что приведённый Вами запрос правильный. Что не так в результате?

I_TEMP ему надо соответствующий максимальному I_TIME
10 апр 19, 16:58    [21858619]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 689
m7m,

понял, в первом посте таблица кривая до жути. Тогда вот так:
select q.id_s, c.i_temp, q.s_name, q.i_time
from (
SELECT a.ID_S id_s, b.S_NAME s_name, max(a.I_TIME) i_time
from Table_I a
       inner join Table_S b on b.id_s=a.id_s
group by 1,2
) as q
inner join Table_I c on c.id_s=q.id_s and c.i_time=q.i_time

Типа того. Надеюсь 2.5 возьмёт и я ошибок не допустил (проверить негде).
10 апр 19, 17:18    [21858641]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 580
KreatorXXI,
Даже любопытно, что будет быстрее, select from select или по старинке
Select I.ID_S, I.I_Temp, S.S_Name, I.I_Time
 From Table_I I
  Join Table_S S On S.ID_S=I.ID_S
 Where I.I_Time=(Select Max(W.I_Time)
                         From Table_I W
                         Where W.ID_S=I.ID_S And W.I_Temp=I.I_Temp)  


Чота мне сдаётся что одна фигня должна быть.
А ещё мне каатся что быстрее всего будет маааленькая селективная процедурка
Create Procedure Get_Cho_Nada
Returns (ID_S Int/*видимо*/, I_Temp Double Precision/*предположительно*/, S_Name Varchar/*надеюсь*/(/*сколько-то*/),
            I_Time TimeStamp)
 Declare Variable ID Int;
 Declare Variable Temp Double Precision;
 Declare Variable S VarChar(/*тыры-пыры*/);
 Declare Variable TS TimeStamp;
As
Begin 
  For Select I.ID_S, I.I_Temp, I.I_Time, S.S_Name
   From Table_I I
    Join Table_S S On S.ID_S=I.ID_S
   Order By 1,2,3
   Into :ID, :Temp, :TS, :S
  Do
   If ((ID_S Is Null)Or(ID_S<>ID)) then
     begin
       If (ID_S Is Not Null) then
        Suspend; 
       ID_S=ID; I_Temp=Temp; S_Name=S; I_Time=TS;  
     end
  If (ID_S Is Not Null) then
   Suspend; 
End


Хотя... Аллах его ведает какие там индексы налеплены.
11 апр 19, 02:33    [21858863]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 689
Старый плюшевый мишка,

select в where обычно неэффективен. Не претендую на истину. Пусть ТC попробует. Хранимка явно лучше, но в условии не было. Оптимизация - это второй шаг. Есть варианты. И хранимка, и execute block, и оконные функции.
11 апр 19, 10:13    [21858990]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 580
KreatorXXI
Старый плюшевый мишка,

select в where обычно неэффективен. Не претендую на истину. Пусть ТC попробует. Хранимка явно лучше, но в условии не было. Оптимизация - это второй шаг. Есть варианты. И хранимка, и execute block, и оконные функции.


От же ж... Я из последних сил пыжусь, поддерживаю имидж старого консервативного пердуна, бодающегося в смысле old is gold и всё чюдненько делается без нанотехнологий, а ты мне в харю селёдочной мордой форточками какими-то наотмашь... И в соседней теме про последний срез клиент того же хочет, и тоже сразу в форточку послали...
11 апр 19, 21:42    [21859944]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Serega325
Member

Откуда:
Сообщений: 70
К сожалению только select запрос, так задачу поставили
KreatorXXI
Старый плюшевый мишка,

select в where обычно неэффективен. Не претендую на истину. Пусть ТC попробует. Хранимка явно лучше, но в условии не было. Оптимизация - это второй шаг. Есть варианты. И хранимка, и execute block, и оконные функции.
12 апр 19, 14:14    [21860558]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Serega325
Member

Откуда:
Сообщений: 70
Испытал этот запрос
Вот что Ibexpert выдал:
Plan
PLAN (W INDEX (SENS_TCON))
PLAN JOIN (I NATURAL, S INDEX (PK_S_CONDITIONAL_SENSORS))

------ Performance info ------
Prepare time = 31ms
Execute time = 42s 422ms
Avg fetch time = 1 767,58 ms
Current memory = 18 185 432
Max memory = 18 248 280
Memory buffers = 2 048
Reads from disk to cache = 408
Writes from cache to disk = 0
Fetches from cache = 117 858 797
Старый плюшевый мишка
KreatorXXI,
Даже любопытно, что будет быстрее, select from select или по старинке
Select I.ID_S, I.I_Temp, S.S_Name, I.I_Time
 From Table_I I
  Join Table_S S On S.ID_S=I.ID_S
 Where I.I_Time=(Select Max(W.I_Time)
                         From Table_I W
                         Where W.ID_S=I.ID_S And W.I_Temp=I.I_Temp)  


Чота мне сдаётся что одна фигня должна быть.
А ещё мне каатся что быстрее всего будет маааленькая селективная процедурка
Create Procedure Get_Cho_Nada
Returns (ID_S Int/*видимо*/, I_Temp Double Precision/*предположительно*/, S_Name Varchar/*надеюсь*/(/*сколько-то*/),
            I_Time TimeStamp)
 Declare Variable ID Int;
 Declare Variable Temp Double Precision;
 Declare Variable S VarChar(/*тыры-пыры*/);
 Declare Variable TS TimeStamp;
As
Begin 
  For Select I.ID_S, I.I_Temp, I.I_Time, S.S_Name
   From Table_I I
    Join Table_S S On S.ID_S=I.ID_S
   Order By 1,2,3
   Into :ID, :Temp, :TS, :S
  Do
   If ((ID_S Is Null)Or(ID_S<>ID)) then
     begin
       If (ID_S Is Not Null) then
        Suspend; 
       ID_S=ID; I_Temp=Temp; S_Name=S; I_Time=TS;  
     end
  If (ID_S Is Not Null) then
   Suspend; 
End


Хотя... Аллах его ведает какие там индексы налеплены.
12 апр 19, 14:16    [21860563]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
Serega325
Member

Откуда:
Сообщений: 70
42с, но работает
Старый плюшевый мишка
KreatorXXI,
Даже любопытно, что будет быстрее, select from select или по старинке
Select I.ID_S, I.I_Temp, S.S_Name, I.I_Time
 From Table_I I
  Join Table_S S On S.ID_S=I.ID_S
 Where I.I_Time=(Select Max(W.I_Time)
                         From Table_I W
                         Where W.ID_S=I.ID_S And W.I_Temp=I.I_Temp)  


Чота мне сдаётся что одна фигня должна быть.
А ещё мне каатся что быстрее всего будет маааленькая селективная процедурка
Create Procedure Get_Cho_Nada
Returns (ID_S Int/*видимо*/, I_Temp Double Precision/*предположительно*/, S_Name Varchar/*надеюсь*/(/*сколько-то*/),
            I_Time TimeStamp)
 Declare Variable ID Int;
 Declare Variable Temp Double Precision;
 Declare Variable S VarChar(/*тыры-пыры*/);
 Declare Variable TS TimeStamp;
As
Begin 
  For Select I.ID_S, I.I_Temp, I.I_Time, S.S_Name
   From Table_I I
    Join Table_S S On S.ID_S=I.ID_S
   Order By 1,2,3
   Into :ID, :Temp, :TS, :S
  Do
   If ((ID_S Is Null)Or(ID_S<>ID)) then
     begin
       If (ID_S Is Not Null) then
        Suspend; 
       ID_S=ID; I_Temp=Temp; S_Name=S; I_Time=TS;  
     end
  If (ID_S Is Not Null) then
   Suspend; 
End


Хотя... Аллах его ведает какие там индексы налеплены.
12 апр 19, 14:17    [21860565]     Ответить | Цитировать Сообщить модератору
 Re: select запрос к двум таблицам  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 689
Serega325,

а мой запрос что выдаёт?
12 апр 19, 14:40    [21860590]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить