Помогите модифицировать селект...

Запросы, планы, оптимизация запросов, ...

Модераторы: 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, а потом отбросив его, ты получишь другой результат? :lol:
Я понял, где ошибка у меня.
Вот так попробуй:

Код: Выделить всё

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 писал(а):Я понял, где ошибка у меня.
Вот так попробуй:
Ты просто маг и волшебник! Спасибо тебе огромнейшее.
Будешь у нас на Псковщине - пиво тебе обеспечено!

Ответить