Помогите модифицировать Select

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

Модераторы: kdv, CyberMax

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Помогите модифицировать Select

Сообщение avenger » 25 июл 2006, 14:40

Здравствуйте уважаемые жители!

Версия - FB 1.5

Есть:

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

CREATE TABLE Messages (
    MessageID INTEGER NOT NULL,
    DateTime INTEGER NOT NULL,
    UserFK INTEGER NOT NULL,
    PrivateUID INTEGER,
    CONSTRAINT PK_Messages PRIMARY KEY (MessageID)
);

ALTER TABLE Messages
    ADD CONSTRAINT Messages_Messages_FK_ReplyMID FOREIGN KEY (ReplyMID) REFERENCES Messages (MessageID) ON DELETE CASCADE
Как можно преобразовать вот этот селект?

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

SELECT  M.DATETIME, M.USERFK,
(
  SELECT RM.DATETIME, RM.USERFK FROM MESSAGES RM
  WHERE M.REPLYMID = RM.MESSAGEID
)
FROM  MESSAGES M
С уважением, Иван.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 июл 2006, 14:51

к чему преобразовать? ну или хотя бы зачем? :-)

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 14:53

dimitr писал(а):к чему преобразовать? ну или хотя бы зачем? :-)
Мне надо, что бы он выполнился...

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

SELECT  M.DATETIME, M.USERFK, 
( 
  SELECT RM.DATETIME FROM MESSAGES RM 
  WHERE M.REPLYMID = RM.MESSAGEID 
),
( 
  SELECT RM.USERFK FROM MESSAGES RM 
  WHERE M.REPLYMID = RM.MESSAGEID 
) 

FROM  MESSAGES M
вот такой выполнится, но у меня не два поля, как в примере, а 10. Неужели такой страшный селект писать?
Последний раз редактировалось avenger 25 июл 2006, 14:55, всего редактировалось 1 раз.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 июл 2006, 14:54

а твой вариант что делает?

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 14:56

dimitr писал(а):а твой вариант что делает?
А мой первый вариант не работает.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 июл 2006, 14:56

тебе осталось только сказать, как именно он не работает

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 14:57

dimitr писал(а):тебе осталось только сказать, как именно он не работает
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 1.
RM.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 июл 2006, 14:57

А про left outer join аффтар слышал когда-нибудь?..

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 14:58

Dimitry Sibiryakov писал(а):А про left outer join аффтар слышал когда-нибудь?..
Слышал, но по моему он здесь не поможет.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 июл 2006, 14:59

Напрасно вы так думаете...

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 июл 2006, 15:00

в общем, RTFM про JOIN-ы. Скорее про LEFT, но может и INNER пойдет - нам отсюда не видно.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 15:01

Dimitry Sibiryakov писал(а):Напрасно вы так думаете...
Ошибался.

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

SELECT  M.DATETIME, M.USERFK, RM.* FROM  MESSAGES M LEFT OUTER JOIN MESSAGES RM ON M.REPLYMID = RM.MESSAGEID
Прекрасно работает.

Спасибо!

P.S. А зачем OUTER нужен?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 июл 2006, 15:04

Наффсякий случай.
Тебя Дмитрий уже послал в нужную FM сторону раз. Сейчас еще пара присоединится если не пойдешь, включая модератора...
Последний раз редактировалось Dimitry Sibiryakov 25 июл 2006, 15:05, всего редактировалось 1 раз.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 15:04

SELECT не по индексу идет! Почему?

План
PLAN JOIN (M NATURAL,RM INDEX (PK_MESSAGES))

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 июл 2006, 15:05

Помниццо, свалил меня сына лет 25 назад вопросом "А почему дерево?" :-D

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 июл 2006, 15:06

На такие вопросы у меня выработался стандартный ответ: "а по-приколу ему!" :lol:

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 15:08

Dimitry Sibiryakov писал(а):На такие вопросы у меня выработался стандартный ответ: "а по-приколу ему!" :lol:
Тогда с пивом интереснее будет... Ну а если по существу?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 июл 2006, 15:12

Куда уж существеннее? Оптимизатору нравится натуральное сканирование потому что оно быстрее.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 25 июл 2006, 15:18

Всем ОГРОМНОЕ спасибо, наставили на путь истиный.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 июл 2006, 18:10

Dimitry Sibiryakov писал(а):Оптимизатору нравится натуральное сканирование потому что оно быстрее.
да у него и выбора-то особого нет :-)

Ответить