![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает ORDER BY [D7, IB6.x]
oleg_p © (2005-09-12 08:31:00)При выполнении запроса
SELECT
PROPERTY.ID_ABS,
PROP_DSC.NAME,
PROP_DSC.CODE,
PROP_DSC.VALUE_TYPE,
PROP_DSC.POINTER_TYPE,
PROP_DSC.LIST,
PROPERTY.PROP_DATA,
PROP_DATA_F.DATA AS DATA_F,
PROP_DATA_I.DATA AS DATA_I,
PROP_DATA_S.DATA AS DATA_S
FROM
PROP_DSC,
PROPERTY
LEFT OUTER JOIN PROP_DATA_F ON PROP_DATA_F.ID=PROPERTY.PROP_DATA
LEFT OUTER JOIN PROP_DATA_I ON PROP_DATA_I.ID=PROPERTY.PROP_DATA
LEFT OUTER JOIN PROP_DATA_S ON PROP_DATA_S.ID=PROPERTY.PROP_DATA
WHERE
PROP_DSC.ID=PROPERTY.PROP_DSC AND
PROPERTY.ID_OBJ=:ID_OBJ AND
PROP_DSC.IS_GROUP='F' AND
PROP_DSC.PARENT=:PARENT
ORDER BY PROP_DSC.ORD
таблица оказывается отсортированной не по PROP_DSC.ORD,
а по первичному индексу таблицы PROP_DSC. Если убрать все OUTER JOIN - сортировка идет нормально.
Fay (2005-09-14 06:45:00) [1]2 Deniz © (14.09.05 6:25) [21]
Не понимаю, как можно испортить жизнь оптимизатору, который годами путает left join и inner join.
Deniz (2005-09-14 06:25:00) [2]>Desdechado © (13.09.05 11:43) [20]
Спасибо, конечно, за консультацию, но все это я давно знаю.
Про OUTER JOIN я ничего не говорил.
Ты меня как-то не так понял. Я имел ввиду что, в одном select'е использовать явные и неявные объединения таблиц не есть гуд и привел пример как это должно выглядеть с inner join.
>oleg_p (13.09.05 08:01) [19]
>Нехорошо, в смысле код некрасивый? Или есть более объективные причины?
Во-первых: есть вероятность, что в последствии ты забудешь прописать в where условие объединения, и результат окажется неверный.
Во-вторых: такой подход усложняет жизнь оптимизатору.
И в-последних: если память не изменяет, то в FireBird 2, такой код будет выдавать предупреждение или ошибку.
Desdechado (2005-09-13 11:43:00) [3]Deniz © (13.09.05 07:33) [18]
А вот использование OUTER JOIN - вполне нормальное явление. Для того оно и придумано в языке, чтоб даже отсутствующие в другой таблице данные использовать, что INNER JOIN не позволяет.
oleg_p (2005-09-13 08:01:00) [4]Во-первых, спасибо всем за помощь.
> Desdechado © (12.09.05 13:12) [16]
Поле ORD сделано специально для сортировки,чтобы иметь возможность поменять местами две соседние записи просто обменявшись значениями ORD (Fay [17] верно сказал). При этом знать, что в нём содержится пользователю не надо вообще.
> Deniz © (13.09.05 07:33) [18]
> переведи объединение PROP_DSC и PROPERTY в inner join, а то как-то нехорошо получается.
Нехорошо, в смысле код некрасивый? Или есть более объективные причины?
Deniz (2005-09-13 07:33:00) [5]+ дополню
Дурной тон это:
...
FROM
PROP_DSC,
PROPERTY
LEFT OUTER JOIN ...
переведи объединение PROP_DSC и PROPERTY в inner join, а то как-то нехорошо получается.
...
FROM
PROP_DSC
INNER JOIN PROPERTY ON PROP_DSC.ID=PROPERTY.PROP_DSC
LEFT OUTER JOIN PROP_DATA_F ON PROP_DATA_F.ID=PROPERTY.PROP_DATA
LEFT OUTER JOIN PROP_DATA_I ON PROP_DATA_I.ID=PROPERTY.PROP_DATA
LEFT OUTER JOIN PROP_DATA_S ON PROP_DATA_S.ID=PROPERTY.PROP_DATA
...
Fay (2005-09-12 16:07:00) [6]2 Desdechado © (12.09.05 13:12) [16]
Представь себе, что мне интересно в каком порядке происходили некие события, но совершенно наплевать когда именно.
Desdechado (2005-09-12 13:12:00) [7]вольному воля...
сортировать яблоки по дереву, с которого они собраны, не указывая этого самого дерева - странно, почти бессмысленно, имхо
Fay (2005-09-12 12:41:00) [8]2 Desdechado © (12.09.05 11:45) [14]
>> сортировка по полю, отсутствующему в SELECT, - очень дурной тон
Бред
Desdechado (2005-09-12 11:45:00) [9]вообще-то сортировка по полю, отсутствующему в SELECT, - очень дурной тон
большинство серверов обрабатывают это по-своему, если вообще обрабатывают
oleg_p (2005-09-12 11:20:00) [10]Удалил индекс по полю PROP_DSC.ORD - ВСЕ ЗАРАБОТАЛО !!
Создаю индекс заново - опять не сортирует.
Придется пожить без индекса :-(
oleg_p (2005-09-12 11:03:00) [11]> Prohodil Mimo © (12.09.05 10:54) [11]
Так их там вроде и нет ???
Prohodil Mimo (2005-09-12 10:54:00) [12]A jesli v kachestve imjon polej ne ispol'zovat' zarezervirovannije slova?
oleg_p (2005-09-12 10:46:00) [13]...
PROP_DSC_IDX1- это индекс на полеPROP_DSC.ORD
Stakan (2005-09-12 10:46:00) [14]Когда-то сталкивался с такой ошибкой. Помогло создание индекса по полю в order by
oleg_p (2005-09-12 10:38:00) [15]Поставил IB 6.5 на другой машине, переписал туда базу. Попробовал тот же запрос сначала в IBExpert удаленно через сеть, потом в IBConsole локально. Абсолютно тот же результат.
Сортировка идет либо по полю PROPERTY.ID_ABS либо по полю PROP_DSC.ID - они оба по сортировке дают один результат,поэтому точно не скажу. Оба поля в PRRIMARY KEY.
Может план запроса натолкнет на мысль:
PLAN MERGE (
SORT (PROP_DSC ORDER PROP_DSC_IDX1),
SORT (JOIN (JOIN (JOIN (PROPERTY NATURAL,PROP_DATA_F INDEX
(RDB$PRIMARY38)),PROP_DATA_I INDEX
(RDB$PRIMARY43)),PROP_DATA_S INDEX (RDB$PRIMARY45))))
Sergey13 (2005-09-12 10:12:00) [16]2 [5] oleg_p (12.09.05 09:57)
>Так на ней и работаю - Firebird 1.0.2.
Тогда попробуй поставить помоложе.
ANB (2005-09-12 10:02:00) [17]
> oleg_p (12.09.05 09:57) [5]
- значит либо версия кривая, либо стоит криво. Стандарт SQL обязывает твою конструкцию работать.
oleg_p (2005-09-12 09:57:00) [18]>А если попробовать Жар птицу?
Так на ней и работаю - Firebird 1.0.2. Надо конечно попробовать чё-нидь ещё ... попробую ib 6.0 поставить.
Sergey13 (2005-09-12 09:44:00) [19]А если попробовать Жар птицу?
oleg_p (2005-09-12 09:39:00) [20]> Не могет такого быть. Значит order by отвалился при формировании запроса. Чем выполняешь ?
В IBDataSet.SelectSQL. Также пробовал в IBExpert - результат тот же.
> Попробуй вставить PROP_DSC.ORD в список полей Select
Уже пробовал - не помогает.