powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select запрос к двум таблицам
17 сообщений из 17, страница 1 из 1
select запрос к двум таблицам
    #39799158
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
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799215
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serega325 Здравствуйте,
не могли бы вы помочь ?
есть две таблицы Table_S и Table_I
Тестовые данные для Table_S:
Код: plaintext
1.
2.
3.
4.
5.
6.
ID_S    S_NAME  
1         name_1 
2         name_2 
3         name_3 
4         name_4 
5         name_5 
Тестовые данные для Table_I:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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, т.е.
должно получится что-то вроде такого
Код: plaintext
1.
2.
3.
4.
5.
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 выводит
Код: sql
1.
2.
3.
4.
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"
то то что написано ниже (желаемое)
Код: plaintext
1.
2.
3.
4.
5.
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 (максимальное, минимальное, первое попавшееся, .....)
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799218
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serega325,

версия ФБ неизвестна? Оконные функции не предлагать?
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799440
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXISerega325,

версия ФБ неизвестна? Оконные функции не предлагать?
Версия 2.5
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799441
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо выводить I_TEMP с максимальным временем
m7mSerega325 Здравствуйте,
не могли бы вы помочь ?
есть две таблицы Table_S и Table_I
Тестовые данные для Table_S:
Код: plaintext
1.
2.
3.
4.
5.
6.
ID_S    S_NAME  
1         name_1 
2         name_2 
3         name_3 
4         name_4 
5         name_5 
Тестовые данные для Table_I:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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, т.е.
должно получится что-то вроде такого
Код: plaintext
1.
2.
3.
4.
5.
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 выводит
Код: sql
1.
2.
3.
4.
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"
то то что написано ниже (желаемое)
Код: plaintext
1.
2.
3.
4.
5.
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 (максимальное, минимальное, первое попавшееся, .....)
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799442
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXISerega325,

версия ФБ неизвестна? Оконные функции не предлагать?
только select запрос
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799459
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serega325,

Посмотри вот здесь Выбор максимальных значений
там должно быть то что тебе нужно, ну я так думаю
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799515
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serega325,

что-то мне сдаётся, что приведённый Вами запрос правильный. Что не так в результате?
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799567
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXISerega325,

что-то мне сдаётся, что приведённый Вами запрос правильный. Что не так в результате?
I_TEMP ему надо соответствующий максимальному I_TIME
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799584
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

понял, в первом посте таблица кривая до жути. Тогда вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 возьмёт и я ошибок не допустил (проверить негде).
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799679
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,
Даже любопытно, что будет быстрее, select from select или по старинке
Код: plsql
1.
2.
3.
4.
5.
6.
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)  



Чота мне сдаётся что одна фигня должна быть.
А ещё мне каатся что быстрее всего будет маааленькая селективная процедурка
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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



Хотя... Аллах его ведает какие там индексы налеплены.
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39799748
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка,

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

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

От же ж... Я из последних сил пыжусь, поддерживаю имидж старого консервативного пердуна, бодающегося в смысле old is gold и всё чюдненько делается без нанотехнологий, а ты мне в харю селёдочной мордой форточками какими-то наотмашь... И в соседней теме про последний срез клиент того же хочет, и тоже сразу в форточку послали...
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39800565
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению только select запрос, так задачу поставилиKreatorXXIСтарый плюшевый мишка,

select в where обычно неэффективен. Не претендую на истину. Пусть ТC попробует. Хранимка явно лучше, но в условии не было. Оптимизация - это второй шаг. Есть варианты. И хранимка, и execute block, и оконные функции.
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39800570
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Испытал этот запрос
Вот что 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 или по старинке
Код: plsql
1.
2.
3.
4.
5.
6.
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)  



Чота мне сдаётся что одна фигня должна быть.
А ещё мне каатся что быстрее всего будет маааленькая селективная процедурка
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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



Хотя... Аллах его ведает какие там индексы налеплены.
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39800572
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
42с, но работаетСтарый плюшевый мишкаKreatorXXI,
Даже любопытно, что будет быстрее, select from select или по старинке
Код: plsql
1.
2.
3.
4.
5.
6.
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)  



Чота мне сдаётся что одна фигня должна быть.
А ещё мне каатся что быстрее всего будет маааленькая селективная процедурка
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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



Хотя... Аллах его ведает какие там индексы налеплены.
...
Рейтинг: 0 / 0
select запрос к двум таблицам
    #39800591
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serega325,

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


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