Страница 1 из 2

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

Добавлено: 25 июл 2006, 14:40
avenger
Здравствуйте уважаемые жители!

Версия - 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
С уважением, Иван.

Добавлено: 25 июл 2006, 14:51
dimitr
к чему преобразовать? ну или хотя бы зачем? :-)

Добавлено: 25 июл 2006, 14:53
avenger
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. Неужели такой страшный селект писать?

Добавлено: 25 июл 2006, 14:54
dimitr
а твой вариант что делает?

Добавлено: 25 июл 2006, 14:56
avenger
dimitr писал(а):а твой вариант что делает?
А мой первый вариант не работает.

Добавлено: 25 июл 2006, 14:56
dimitr
тебе осталось только сказать, как именно он не работает

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

Добавлено: 25 июл 2006, 14:57
Dimitry Sibiryakov
А про left outer join аффтар слышал когда-нибудь?..

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

Добавлено: 25 июл 2006, 14:59
Dimitry Sibiryakov
Напрасно вы так думаете...

Добавлено: 25 июл 2006, 15:00
dimitr
в общем, RTFM про JOIN-ы. Скорее про LEFT, но может и INNER пойдет - нам отсюда не видно.

Добавлено: 25 июл 2006, 15:01
avenger
Dimitry Sibiryakov писал(а):Напрасно вы так думаете...
Ошибался.

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

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

Спасибо!

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

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

Добавлено: 25 июл 2006, 15:04
avenger
SELECT не по индексу идет! Почему?

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

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

Добавлено: 25 июл 2006, 15:06
Dimitry Sibiryakov
На такие вопросы у меня выработался стандартный ответ: "а по-приколу ему!" :lol:

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

Добавлено: 25 июл 2006, 15:12
Dimitry Sibiryakov
Куда уж существеннее? Оптимизатору нравится натуральное сканирование потому что оно быстрее.

Добавлено: 25 июл 2006, 15:18
avenger
Всем ОГРОМНОЕ спасибо, наставили на путь истиный.

Добавлено: 25 июл 2006, 18:10
dimitr
Dimitry Sibiryakov писал(а):Оптимизатору нравится натуральное сканирование потому что оно быстрее.
да у него и выбора-то особого нет :-)