Сортировка по Lookup полю
Модератор: kdv
Сортировка по Lookup полю
Извиняюсь, если этот вопрос уже обсуждался, (я прочитал некоторые темы) но он так и остался для меня непонятным.
Имеется запрос:
select NAME_ID, (select ID, NAME from B where B.ID=A.NAME_ID) as NAME FROM A
добавить к этому запросу ORDER BY NAME насколько я понимаю нельзя. Так как же мне отсортировать данные по полю NAME (оно символьное и сортировка должна быть в алфавитном порядке).
Имеется запрос:
select NAME_ID, (select ID, NAME from B where B.ID=A.NAME_ID) as NAME FROM A
добавить к этому запросу ORDER BY NAME насколько я понимаю нельзя. Так как же мне отсортировать данные по полю NAME (оно символьное и сортировка должна быть в алфавитном порядке).
Прочитай документацию по ORDER BY, она умеет сортировать не по имени поля.
Так же прочитай про JOIN
Так же прочитай про JOIN
А как заджойнить такую ситуацию:
есть таблица A в которой есть столбцы MODEL_ID, PTR_ID, PST_ID
есть таблица B в которой есть столбцы ID, MODEL_NAME
есть таблица C в которой есть столбцы ID, PTRPST_NAME
мне надо выбрать в таблицу A вычисляемые поля:
MODEL_NAME, где A.MODEL_ID = B.ID
PTR_NAME, где A.PTR_ID = C.ID
PST_NAME, где A.PST_ID = C.ID
далее добавить сортировку полей MODEL_NAME, PTR_NAME, PST_NAME, с сортировкой уже разобрался, но выбор этих полей произвожу при помощи select'а.
И еще, я использую сервер Firebird 1.0.х в нем по умолчанию при сортировке, строки имеющие значение NULL должны располагаться в конце набора данных, а получается, что они отображаются в начале.
есть таблица A в которой есть столбцы MODEL_ID, PTR_ID, PST_ID
есть таблица B в которой есть столбцы ID, MODEL_NAME
есть таблица C в которой есть столбцы ID, PTRPST_NAME
мне надо выбрать в таблицу A вычисляемые поля:
MODEL_NAME, где A.MODEL_ID = B.ID
PTR_NAME, где A.PTR_ID = C.ID
PST_NAME, где A.PST_ID = C.ID
далее добавить сортировку полей MODEL_NAME, PTR_NAME, PST_NAME, с сортировкой уже разобрался, но выбор этих полей произвожу при помощи select'а.
И еще, я использую сервер Firebird 1.0.х в нем по умолчанию при сортировке, строки имеющие значение NULL должны располагаться в конце набора данных, а получается, что они отображаются в начале.
Разобрался (не с той стороны таблицы всавлял
) Получилось вот что:
select
M.MODEL_NAME AS MODEL_NAME,
P1.PTRPST_NAME AS PTR_NAME,
P2.PTRPST_NAME AS PST_NAME
from PTRPST P1, PTRPST P2, DEVMODELS M
join DEVICES D
on (M.MODEL_ID=D.MODEL_ID) and (P1.PTRPST_ID=D.PTR_ID) and (P2.PTRPST_ID=D.PST_ID)
where D.TYPE_ID=2
order by 3
так правильно?
а было вот как:
select
(select MODEL_NAME from DEVMODELS M where M.MODEL_ID=D.MODEL_ID) AS MODEL_NAME,
(select PTRPST_NAME from PTRPST PP where PP.PTRPST_ID=D.PTR_ID) AS DEV_PTR,
(select PTRPST_NAME from PTRPST PP where PP.PTRPST_ID=D.PST_ID) AS DEV_PST
from DEVICES D
where TYPE_ID=2
order by 3
объясните плз как правильнее строить запросы, через join или вложенный select.
И еще по поводу сортировки, нулевые строки все равно идут в начале набора данных.

select
M.MODEL_NAME AS MODEL_NAME,
P1.PTRPST_NAME AS PTR_NAME,
P2.PTRPST_NAME AS PST_NAME
from PTRPST P1, PTRPST P2, DEVMODELS M
join DEVICES D
on (M.MODEL_ID=D.MODEL_ID) and (P1.PTRPST_ID=D.PTR_ID) and (P2.PTRPST_ID=D.PST_ID)
where D.TYPE_ID=2
order by 3
так правильно?
а было вот как:
select
(select MODEL_NAME from DEVMODELS M where M.MODEL_ID=D.MODEL_ID) AS MODEL_NAME,
(select PTRPST_NAME from PTRPST PP where PP.PTRPST_ID=D.PTR_ID) AS DEV_PTR,
(select PTRPST_NAME from PTRPST PP where PP.PTRPST_ID=D.PST_ID) AS DEV_PST
from DEVICES D
where TYPE_ID=2
order by 3
объясните плз как правильнее строить запросы, через join или вложенный select.
И еще по поводу сортировки, нулевые строки все равно идут в начале набора данных.
-
- Сообщения: 15
- Зарегистрирован: 10 янв 2007, 18:35
Код: Выделить всё
select
M.MODEL_NAME AS MODEL_NAME,
P1.PTRPST_NAME AS PTR_NAME,
P2.PTRPST_NAME AS PST_NAME
from PTRPST P1, PTRPST P2, DEVMODELS M
join DEVICES D
on (M.MODEL_ID=D.MODEL_ID) and (P1.PTRPST_ID=D.PTR_ID) and (P2.PTRPST_ID=D.PST_ID)
from DEVICES D
join PTRPST P1 on (P1.PTRPST_ID=D.PTR_ID)
join PTRPST P2 on (P2.PTRPST_ID=D.PST_ID)
join DEVMODELS M on (M.MODEL_ID=D.MODEL_ID)
where D.TYPE_ID=2
order by PST_NAME
А это зачем? Вроде все работает без этого куска кода?StealthAIDS писал(а):Код: Выделить всё
... from DEVICES D join PTRPST P1 on (P1.PTRPST_ID=D.PTR_ID) join PTRPST P2 on (P2.PTRPST_ID=D.PST_ID) join DEVMODELS M on (M.MODEL_ID=D.MODEL_ID) ...
-
- Сообщения: 15
- Зарегистрирован: 10 янв 2007, 18:35
WildSery, я понял свою ошибку, исправил к такому виду, теперь правильно построил запрос?
2StealthAIDS я сказал насчет лишнего куска, потому что у тебя в запросе смешалось два запроса и причем тут самокоментируемость?
Код: Выделить всё
select
M.MODEL_NAME AS MODEL_NAME,
P1.PTRPST_NAME AS PTR_NAME,
P2.PTRPST_NAME AS PST_NAME
from DEVICES D
left join PTRPST P1 on (P1.PTRPST_ID=D.PTR_ID)
left join PTRPST P2 on (P2.PTRPST_ID=D.PST_ID)
left join DEVMODELS M on (M.MODEL_ID=D.MODEL_ID)
where D.TYPE_ID=2
order by 2
какие, блин, индексы?Ну насколько я понял, LEFT JOIN в моем случае нужен только если в записях таблицы D будут содержаться не все индексы ссылающиеся на записи из таблиц P1, P2 и M. Так?
читай тут. потом подумай над своими вопросами.А что JOIN будет работать быстрее чем LEFT JOIN, если из правых таблиц придется выбирать все записи?
www.ibase.ru/devinfo/joins.htm
Не так выразился, я не имел в виду индексы в понимании терминологии Firebird сервера, а подразумевал столбец ID в таблице D. Ладно забейте, спасибо за помощь, болше вопросов не имею... хотя остался вопрос, почему при выполнении этого запроса:
NULL записи (в отсортированном столбце PTR_NAME) идут в начале, а не в конце. Я юзаю Firebird 1.0.x
Код: Выделить всё
select
M.MODEL_NAME AS MODEL_NAME,
P1.PTRPST_NAME AS PTR_NAME,
P2.PTRPST_NAME AS PST_NAME
from DEVICES D
left join PTRPST P1 on (P1.PTRPST_ID=D.PTR_ID)
left join PTRPST P2 on (P2.PTRPST_ID=D.PST_ID)
left join DEVMODELS M on (M.MODEL_ID=D.MODEL_ID)
where D.TYPE_ID=2
order by 2