Страница 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 назад вопросом "А почему дерево?"

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

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

Тогда с пивом интереснее будет... Ну а если по существу?
Добавлено: 25 июл 2006, 15:12
Dimitry Sibiryakov
Куда уж существеннее? Оптимизатору нравится натуральное сканирование потому что оно быстрее.
Добавлено: 25 июл 2006, 15:18
avenger
Всем ОГРОМНОЕ спасибо, наставили на путь истиный.
Добавлено: 25 июл 2006, 18:10
dimitr
Dimitry Sibiryakov писал(а):Оптимизатору нравится натуральное сканирование потому что оно быстрее.
да у него и выбора-то особого нет
