Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Join не по всему полю / 25 сообщений из 33, страница 1 из 2
05.08.2003, 14:45
    #32227570
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Есть 2 таблицы
Табл1 (ID,Value1) - записей немного
Табл2 (Value2) - Записей много.
и функция F
Надо из Табл2 отобрать такие, что Value1=F(Value2)

Сделано криво:
strSQL1=select F(Табл2) as Result from Табл2
strSQL2=select (Табл1.ID) where (Табл1.Value1) in (strSQL1)

Как бы Вы красиво решили эту проблему?
...
Рейтинг: 0 / 0
05.08.2003, 14:48
    #32227575
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Corr
"Из табл1 отобрать такие"
...
Рейтинг: 0 / 0
05.08.2003, 15:02
    #32227607
VIG
VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Код: plaintext
1.
2.
select t1.* from table1 as t1 inner join 
 (select F(t2.value2)  as Result from table2 as t2) as tt
on t1.value1=tt.result
...
Рейтинг: 0 / 0
05.08.2003, 15:03
    #32227608
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Хотелось бы сделать типа
select Табл1.ID from Табл1 innerJoin Табл2 on Табл1.Value1=F(Табл2.Value2)
Но такое, наверное, работать не будет...
...
Рейтинг: 0 / 0
05.08.2003, 15:06
    #32227612
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
select Табл1.ID from Табл1, Табл2 where Табл1.Value1=F(Табл2.Value2)
...
Рейтинг: 0 / 0
05.08.2003, 15:09
    #32227616
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
2 ящериц-варан

А ты попробуй и скажи, будет работать или нет
Блин, сложно что-ли уже написанный (в форум) вопрос в аксес засунуть? Прежде чем вопросы на весь инет задавать?
ахереть легче

Блин, что за люди живут в поселке андреевка?
...
Рейтинг: 0 / 0
05.08.2003, 15:09
    #32227618
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Join будет быстрее работать чем where?
...
Рейтинг: 0 / 0
05.08.2003, 15:14
    #32227627
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Лох Позорный,
Да, лодыри тут, в основном, проживают.
...
Рейтинг: 0 / 0
05.08.2003, 15:17
    #32227635
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
VIG, Владимир Саныч, спасибо, завтра потестирую на скорость все варинты. Проблема в том, что с подзапросом работает очень медленно...
...
Рейтинг: 0 / 0
05.08.2003, 15:19
    #32227636
VIG
VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Нескромный вопрос
Varan=wara???
...
Рейтинг: 0 / 0
05.08.2003, 15:21
    #32227640
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
VIG
Да, чтоб не было вопросов насчет половой принадлежности.
...
Рейтинг: 0 / 0
28.08.2003, 19:09
    #32250629
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Во прикол вариант VIG работает в 20 раз быстрее!

Данные о тестовых таблицах:
Табл 1 - 256 строк
Табл 2 - 13 128 строк

Вариант1 (42 секунды)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
dim strSql1 as string
Dim strSQL as string

strSql1=strSQL1=select F(Табл2.Value2) as Result from Табл2 
strSQL2=select (Табл1.ID) where (Табл1.Value1) in (strSQL1) 
CurrentDb.Execute strSQL



Вариант 2 (2 секунды)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Dim qdTemp As QueryDef
Dim qdfName As String
Dim strSql1 as string
Dim strSQL as string

strSql1=strSQL1=select F(Табл2.Value2) as Result from Табл2

'Название временного запроса
qdfName = "tempNumber"

 'Создать временный запрос
Set qdTemp = CurrentDb.CreateQueryDef(qdfName, strSQL1)
'Закрыть TableDef
   qdTemp.Close

      strSQL = "Select Табл1.ID from Табл1"
      strSQL = strSQL & " INNER JOIN " & qdfName & " on Табл1.Value1="
      strSQL = strSQL & qdfName & ".Value2 "
      strSQL = strSQL & "SET tmpNewFiles.flagNew=true"

'Выполнить запрос и убить временый запрос
docmd.runsql(strSQL)
DoCmd.DeleteObject acQuery, qdfName



Интересно, почему такая разница, ведь ничего, по сути, не изменилось!?
...
Рейтинг: 0 / 0
28.08.2003, 19:23
    #32250647
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
а вариант Саныча проверял?
...
Рейтинг: 0 / 0
28.08.2003, 19:25
    #32250649
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
fedd,
Нет
...
Рейтинг: 0 / 0
28.08.2003, 19:29
    #32250653
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
я думаю join будет работать также как и where, пользоваться индексами в подзапросах/приджоиненных таблицах, а in ими пользоваться не может, поэтому работает медленно
...
Рейтинг: 0 / 0
28.08.2003, 19:30
    #32250655
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
впрочем, насчет индексов я погорячился... там же F(ttt), какой индекс..
...
Рейтинг: 0 / 0
28.08.2003, 19:37
    #32250666
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Вариант Саныча - вообще не то, что надо, выдает :-( (Хотя и быстро)
...
Рейтинг: 0 / 0
28.08.2003, 19:40
    #32250670
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Пардон, Варинт Саныча - 2 минуты 50 секунд ( возвращает то, что надо), но он проще, надо было его и делать...
...
Рейтинг: 0 / 0
28.08.2003, 19:51
    #32250676
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Хотелось бы услышать комментарии - из за чего такая разница (в 20 раз) в скорости?
...
Рейтинг: 0 / 0
28.08.2003, 20:23
    #32250703
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Запрос с IN ,как правило,всегда работает медленнее,чем с JOIN
...
Рейтинг: 0 / 0
28.08.2003, 20:28
    #32250707
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Так как правило или всегда ?
...
Рейтинг: 0 / 0
28.08.2003, 20:28
    #32250708
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
С чем связана такая ошеломительная разница?
...
Рейтинг: 0 / 0
28.08.2003, 22:10
    #32250736
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Так как правило или всегда?
Забыл написать-нужное подчеркнуть
...
Рейтинг: 0 / 0
29.08.2003, 10:24
    #32250983
Varan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Короче, не знает никто.
Я опечален :-(
...
Рейтинг: 0 / 0
29.08.2003, 10:42
    #32251002
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join не по всему полю
Есть мнение:
видимо в первом варианте он вызывает подзапрос для каждой строки и потому
тормозит.
а во-втором варианте у тебя Ас запрос, который либо
вызывается однажды, либо (что скорее всего) хорошо кэшируется.
Отсюда и такая разница.
имхо.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Join не по всему полю / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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