Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Проблема с запросом на 1sqlite [част. решено] (число прочтений - 6931 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #15 - 25. Декабря 2008 :: 07:23
Печать  
Отбор на "Форумы.ПоследнееСообщение" стоит?
Можешь писать запрос через JOIN. Как-то привычнее, хотя это дело привычки
Код
Выбрать все
SELECT
Форумы.Descr [Наименование :Справочник.Форумы],
Форумы.Проблема [Проблема :Справочник],
Сообщения.ДатаВремяСоздания [ДатаПослСообщения]
FROM
Справочник_Форумы Форумы
LEFT JOIN Справочник_Комментарии Сообщения ON ((:ВидСправочника.Комментарии || Сообщения.ID)=Форумы.ПоследнееСообщение)
WHERE
(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
ORDER BY ДатаПослСообщения DESC 


Какой именно JOIN тебе нужен LEFT или INNER я не знаяю.

А что давала отладка на прдыдущий вариант запроса?
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #16 - 25. Декабря 2008 :: 07:33
Печать  
Цитата:
SELECT
Форумы.Descr [Наименование :Справочник.Форумы],
Форумы.Проблема [Проблема :Справочник],
Сообщения.ДатаВремяСоздания [ДатаПослСообщения]
FROM
Справочник_Форумы Форумы, Справочник_Комментарии Сообщения
WHERE
(Форумы.IsMark = '') AND (Сообщения.IsMark = '') AND (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID)
ORDER BY ДатаПослСообщения DESC
LIMIT 0,15
create table x(
ID char(9) collate _1C
,CODE char(9) collate _1C
,DESCR char(25) collate _1C
,ISMARK char(1) collate _1C
,VERSTAMP char(6) collate _1C
,Проблема char(13) collate _1C
,ДатаВозникновения char(8)
,ПоследнееСообщение char(13) collate _1C
, idx_ID char(9) collate _1C
, idx_CODE char(9) collate _1C
, idx_DESCR char(25) collate _1C
, idx_Проблема_DESCR char(38) collate _1C
)
create table x(
ID char(9) collate _1C
,CODE char(5) collate _1C
,ISMARK char(1) collate _1C
,VERSTAMP char(6) collate _1C
,Автор char(9) collate _1C
,ДатаВремяИзменения char(14) collate _1C
,ДатаВремяСоздания char(14) collate _1C
,КолвоИзменений numeric(3, 0)
,Корень char(9) collate _1C
,Объект char(13) collate _1C
,Решение char(23) collate _1C
,TSP10782 char(3) collate _1C
,ТвердостьРешения numeric(3, 0)
,Комментарий text collate _1C
, idx_ID char(9) collate _1C
, idx_CODE char(5) collate _1C
, idx_Объект_CODE char(18) collate _1C
)
Подбор индекса для таблицы SC13073:
     Ограничения: ISMARK=;
     В кэше не найдено
     Индекс не выбран.
     Стоимость: 9988
Подбор индекса для таблицы SC10786:
     Ограничения: ISMARK=;
     Упорядочить: SP11659[ДатаВремяСоздания] desc,
     В кэше не найдено
     Индекс не выбран.
     Стоимость: 9988
Подбор индекса для таблицы SC10786:
     Ограничения: ISMARK=; ID=;
     В кэше не найдено
     Выбран индекс IDD: ID
     Стоимость: 12

Отбор не стоит. Щас поставлю и потестю

Установил отбор - никакого улучшения
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #17 - 25. Декабря 2008 :: 08:06
Печать  
А такой запрос что теперь показывает в отладке:
Код
Выбрать все
SELECT
Форумы.Descr [Наименование :Справочник.Форумы],
Форумы.Проблема [Проблема :Справочник],
Сообщения.ДатаВремяСоздания [ДатаПослСообщения]
FROM
Справочник_Форумы Форумы
INNER JOIN Справочник_Комментарии Сообщения ON (Форумы.ПоследнееСообщение =(:ВидСправочника.Комментарии || Сообщения.ID))
WHERE
(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
ORDER BY ДатаПослСообщения DESC  

  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #18 - 25. Декабря 2008 :: 08:47
Печать  
Цитата:
SELECT
Форумы.Descr [Наименование :Справочник.Форумы],
Форумы.Проблема [Проблема :Справочник],
Сообщения.ДатаВремяСоздания [ДатаПослСообщения]
FROM
Справочник_Форумы Форумы
INNER JOIN Справочник_Комментарии Сообщения ON (Форумы.ПоследнееСообщение =(' 8BM' || Сообщения.ID))
WHERE
(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
ORDER BY ДатаПослСообщения DESC
LIMIT 0,15
Подбор индекса для таблицы SC13073:
     Ограничения: ISMARK=;
     Найдено в кэше
     Индекс не выбран.
     Стоимость: 9988
Подбор индекса для таблицы SC10786:
     Ограничения: ISMARK=;
     Упорядочить: SP11659[ДатаВремяСоздания] desc,
     Найдено в кэше
     Индекс не выбран.
     Стоимость: 9988
Подбор индекса для таблицы SC10786:
     Ограничения: ISMARK=;
     Найдено в кэше
     Индекс не выбран.
     Стоимость: 9988
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #19 - 25. Декабря 2008 :: 09:36
Печать  
Да, sqlite не выбирает индекса при таком построении запроса  Печаль
Млин, сдаюсь. Может ещё кто-то подскажет.
Единственное, что приходит на ум, это в спр-ке Форумы добавить реквизит с отбором "ВидСправочникаСообщений", куда бы записывался вид справочника сообщений в формате ИБ. Затем в запросе делать JOIN по
Код
Выбрать все
ON (Форумы.ВидСправочникаСообщений = :ВидСправочника.Комментарии) AND (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID) 


но как-то не шибко красиво получается.

или пробуй через ОЛЕДБ.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #20 - 25. Декабря 2008 :: 10:08
Печать  
ок. спасибо за помощь. большей частью проблему решил.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite [част. решено]
Ответ #21 - 26. Декабря 2008 :: 14:49
Печать  
Код
Выбрать все
|SELECT
|Форумы.Descr [Наименование :Справочник.Форумы],
|Форумы.Проблема [Проблема :Справочник],
|Сообщения.ДатаВремяСоздания [ДатаПослСообщения], 1 [ТипПроблемы]
|FROM
|Справочник_Форумы Форумы
|INNER JOIN Справочник_Комментарии Сообщения ON (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID)
|WHERE
|(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
|
|UNION
|
|SELECT
|Форумы.Descr [Наименование :Справочник.Форумы],
|Форумы.Проблема [Проблема :Справочник],
|Сообщения.ДатаВремяСоздания [ДатаПослСообщения], 2 [ТипПроблемы]
|FROM
|Справочник_Форумы Форумы
|INNER JOIN Справочник_УсилияЗадачи2 Сообщения ON (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID)
|WHERE
|(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
|
|ORDER BY ДатаПослСообщения DESC 


Данный код делает выборку из Справочника форумы, сортируя записи по дате Форумы.ПоследнееСообщение.ДатаВремяСоздания.
Форумы.ПоследнееСообщение - справочник неопредленного вида. На данный момент в моей базе он бывает двух видов: Справочник.Комментарии и Справочник.УсилияЗадачи2.
Если вдруг Форумы.ПоследнееСообщение будет ссылаться в будущем на справочники и других видов, запрос придется переделывать соответственно, делая UNION столько раз, сколько видов справочников в Форумы.ПоследнееСообщение. Есть ли универсальный способ решить эту проблему?
Спасибо.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite [част. решено]
Ответ #22 - 26. Декабря 2008 :: 15:24
Печать  
И еще проблема. Запрос вроде бы работает, но есть проблема.
Код
Выбрать все
|SELECT
|Форумы.Проблема [Проблема :Справочник],
|Форумы.ПоследнееСообщение [ПоследнееСообщение :Справочник],
|Сообщения.ДатаВремяСоздания [ДатаПослСообщения], 1 [ТипПроблемы]
|FROM
|Справочник_Форумы Форумы
|INNER JOIN Справочник_Комментарии Сообщения ON (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID)
|WHERE
|(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
|
|UNION
|
|SELECT
|Форумы.Проблема [Проблема :Справочник],
|Форумы.ПоследнееСообщение [ПоследнееСообщение :Справочник],
|Сообщения.ДатаВремяСоздания [ДатаПослСообщения], 2 [ТипПроблемы]
|FROM
|Справочник_Форумы Форумы
|INNER JOIN Справочник_УсилияЗадачи2 Сообщения ON (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID)
|WHERE
|(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
|
|ORDER BY ДатаПослСообщения DESC 


Смотрите вложение.
Форумы.Проблемы - тоже справочник неопр. вида.
Вторая строка: ТипПроблемы=2, дата/время посл. сообщения верная, но само сообщение (3402) - не то (должно быть вида УсилияЗадачи2, а на самом деле - вида Комментарии). Что-то не так в моем запросе с точки зрения типизации.
  

query.PNG ( 3 KB | Загрузки )
query.PNG
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с запросом на 1sqlite [част. решено]
Ответ #23 - 26. Декабря 2008 :: 18:48
Печать  
Так
Код
Выбрать все
(SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID) 


джойнить в твоём случае нельзя, т.к. ID элементов справочников Комментарии и УсилияЗадачи2 могут быть одинаковыми.
Тебе надо выбирать либо ты делаешь джойн по:
Код
Выбрать все
Форумы.ПоследнееСообщение = :ВидСправочника.НужныйСправочник || Сообщения.ID 


но тут мы, как выяснили выше, не попадаем в индекс;
либо добавлять реквизит с видом справочника;
либо воспользоваться прямым доступом через ОЛЕДБ.

либо ещё кто-нибудь что-нибудь подскажет путное
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite [част. решено]
Ответ #24 - 27. Декабря 2008 :: 11:28
Печать  
Ступил.
blindvic писал(а) 26. Декабря 2008 :: 14:49:
Если вдруг Форумы.ПоследнееСообщение будет ссылаться в будущем на справочники и других видов, запрос придется переделывать соответственно, делая UNION столько раз, сколько видов справочников в Форумы.ПоследнееСообщение. Есть ли универсальный способ решить эту проблему?
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Проблема с запросом на 1sqlite
Ответ #25 - 29. Декабря 2008 :: 16:22
Печать  
Переделал
Код
Выбрать все
SELECT
Форумы.Descr [Наименование :Справочник.Форумы],
Форумы.Проблема [Проблема :Справочник],
Сообщения.ДатаВремяСоздания [ДатаПослСообщения]
FROM
Справочник_Форумы Форумы
INNER JOIN Справочник_Комментарии Сообщения ON (Форумы.ПоследнееСообщение =(:ВидСправочника.Комментарии || Сообщения.ID))
WHERE
(Форумы.IsMark = '') AND (Сообщения.IsMark = '')
ORDER BY ДатаПослСообщения DESC  


на
Код
Выбрать все
|SELECT
|Форумы.Descr [Наименование :Справочник.Форумы],
|Форумы.Проблема [Проблема :Справочник],
|Сообщения.ДатаВремяСоздания [ДатаПослСообщения]
|FROM
|Справочник_Форумы Форумы, Справочник_Комментарии Сообщения
|WHERE
|(Форумы.IsMark = '') AND (Сообщения.IsMark = '') AND (SUBSTR(Форумы.ПоследнееСообщение, 1, 4) = :ВидСправочника.Комментарии) AND (SUBSTR(Форумы.ПоследнееСообщение,5,9) = Сообщения.ID)
|ORDER BY ДатаПослСообщения DESC 


теперь все быстро
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать