Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
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.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 25 июл 2006, 14:58
Dimitry Sibiryakov писал(а):А про left outer join аффтар слышал когда-нибудь?..
Слышал, но по моему он здесь не поможет.
-
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 назад вопросом "А почему дерево?"

-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 25 июл 2006, 15:08
Dimitry Sibiryakov писал(а):На такие вопросы у меня выработался стандартный ответ: "а по-приколу ему!"

Тогда с пивом интереснее будет... Ну а если по существу?
-
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 писал(а):Оптимизатору нравится натуральное сканирование потому что оно быстрее.
да у него и выбора-то особого нет
