Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 янв 2007, 15:39
Привет Всем!
Как можно переписать
Код: Выделить всё
SELECT COUNT(*) FROM (SELECT SOUNDEX FROM SEARCH_QUERY WHERE QUERY_ID = :QUERY_ID GROUP BY SOUNDEX)
для FB1.5?
А вообще-то надо переписать вот это, если возможно без промежуточных таблиц:
Код: Выделить всё
FOR SELECT ATTRIBUTE_PF, SUM(SUMWEIGHT), SUM(COUNTWORD) FROM (
SELECT SL.ATTRIBUTE_PF, SW.SOUNDEX, SUM(SL.WEIGHT) AS SUMWEIGHT, COUNT(*) AS COUNTWORD
FROM SEARCH_QUERY SQ
JOIN SEARCH_WORDS SW ON SW.SOUNDEX = SQ.SOUNDEX
JOIN SEARCH_LINKS SL ON SL.WORD_PF = SW.WORD_ID
WHERE SQ.QUERY_ID = :QUERY_ID
GROUP BY SL.ATTRIBUTE_PF, SW.SOUNDEX
)
GROUP BY ATTRIBUTE_PF
HAVING COUNT(*) >= ( SELECT COUNT(*) FROM (SELECT SOUNDEX FROM SEARCH_QUERY WHERE QUERY_ID = :QUERY_ID GROUP BY SOUNDEX) )
INTO :ATTRIBUTE_ID, :WEIGHT, :WORD_COUNT
DO SUSPEND;
С уважением, Иван.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 18 янв 2007, 15:42
Код: Выделить всё
SELECT COUNT(DISTINCT SOUNDEX) FROM SEARCH_QUERY WHERE QUERY_ID = :QUERY_ID
Из головы пишу, возможны ошибки:
Код: Выделить всё
SELECT SL.ATTRIBUTE_PF, SUM(SL.WEIGHT), COUNT(*)
FROM SEARCH_QUERY SQ
JOIN SEARCH_WORDS SW ON SW.SOUNDEX = SQ.SOUNDEX
JOIN SEARCH_LINKS SL ON SL.WORD_PF = SW.WORD_ID
WHERE SQ.QUERY_ID = :QUERY_ID
GROUP BY SL.ATTRIBUTE_PF
HAVING COUNT(*) >= (SELECT COUNT(DISTINCT SOUNDEX) FROM SEARCH_QUERY WHERE QUERY_ID = :QUERY_ID)
Вообще не совсем ясно, тебе нужно отобрать записи, которых больше чем всех SOUNDEX, а на самом деле может нужно только входящих в один ATTRIBUTE_PF.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 янв 2007, 15:55
WildSery писал(а):Код: Выделить всё
SELECT COUNT(DISTINCT SOUNDEX) FROM SEARCH_QUERY WHERE QUERY_ID = :QUERY_ID
Работает. Логично. Спасибо.
А весь(большой) запрос можно, или только через промежуточный "ЭТАП"?
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 янв 2007, 16:45
WildSery писал(а):Из головы пишу, возможны ошибки:
Приведенный селект работает неправильно.
WildSery писал(а):Вообще не совсем ясно, тебе нужно отобрать записи, которых больше чем всех SOUNDEX, а на самом деле может нужно только входящих в один ATTRIBUTE_PF.
Данные групируются сначало по двум полям SL.ATTRIBUTE_PF, SW.SOUNDEX. Затем результат группируется по ATTRIBUTE_PF.
Последний раз редактировалось
avenger 18 янв 2007, 17:05, всего редактировалось 3 раза.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 18 янв 2007, 16:57
avenger писал(а):Данные групируются сначало по двум полям SL.ATTRIBUTE_PF, SW.SOUNDEX. Затем результат группируется по ATTRIBUTE_PF.
Ты хочешь сказать, что сгруппировав сперва по SW.SOUNDEX, а потом отбросив его, ты получишь другой результат?
Я понял, где ошибка у меня.
Вот так попробуй:
Код: Выделить всё
SELECT SL.ATTRIBUTE_PF, SUM(SL.WEIGHT), COUNT(*)
FROM SEARCH_QUERY SQ
JOIN SEARCH_WORDS SW ON SW.SOUNDEX = SQ.SOUNDEX
JOIN SEARCH_LINKS SL ON SL.WORD_PF = SW.WORD_ID
WHERE SQ.QUERY_ID = :QUERY_ID
GROUP BY SL.ATTRIBUTE_PF
HAVING COUNT(DISTINCT SW.SOUNDEX) >= (SELECT COUNT(DISTINCT SOUNDEX) FROM SEARCH_QUERY WHERE QUERY_ID = :QUERY_ID)
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 янв 2007, 17:04
WildSery писал(а):Я понял, где ошибка у меня.
Вот так попробуй:
Ты просто маг и волшебник! Спасибо тебе огромнейшее.
Будешь у нас на Псковщине - пиво тебе обеспечено!