Страница 1 из 2
Сортировка по Lookup полю
Добавлено: 25 янв 2007, 17:47
bender
Извиняюсь, если этот вопрос уже обсуждался, (я прочитал некоторые темы) но он так и остался для меня непонятным.
Имеется запрос:
select NAME_ID, (select ID, NAME from B where B.ID=A.NAME_ID) as NAME FROM A
добавить к этому запросу ORDER BY NAME насколько я понимаю нельзя. Так как же мне отсортировать данные по полю NAME (оно символьное и сортировка должна быть в алфавитном порядке).
Добавлено: 25 янв 2007, 17:48
bender
сорри за второй топ, сервак глюкнул
Добавлено: 25 янв 2007, 17:51
WildSery
И на каком же сервере у тебя работает сей запрос?
Добавлено: 25 янв 2007, 18:08
bender
Сорри погорячился, вот так:
select NAME_ID, (select NAME from B where B.ID=A.NAME_ID) as NAME FROM A
Добавлено: 25 янв 2007, 18:41
Merlin
Отсортировать-то нефиг делать, но лучше научиться джойнить.
Добавлено: 25 янв 2007, 18:49
WildSery
Прочитай документацию по ORDER BY, она умеет сортировать не по имени поля.
Так же прочитай про
JOIN
Добавлено: 26 янв 2007, 14:41
bender
А как заджойнить такую ситуацию:
есть таблица 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 должны располагаться в конце набора данных, а получается, что они отображаются в начале.
Добавлено: 26 янв 2007, 15:12
kdv
MODEL_NAME, где A.MODEL_ID = B.ID
PTR_NAME, где A.PTR_ID = C.ID
PST_NAME, где A.PST_ID = C.ID
from TABLE1 A, TABLE1 B, C
where a.field1 = c.id and b.field1 = c.id
догадаться очень сложно? and/or по вкусу.
классическая задача "покупатель и поставщик в одной таблице"
Добавлено: 26 янв 2007, 15:22
WildSery
bender писал(а):А как заджойнить такую ситуацию:
Что такое алиас таблиц в запросе разобрался?
Тогда несложно - в одном селекте можно одну и ту же таблицу присоединять многократно с разными алиасами.
Добавлено: 26 янв 2007, 16:51
bender
Разобрался (не с той стороны таблицы всавлял

) Получилось вот что:
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.
И еще по поводу сортировки, нулевые строки все равно идут в начале набора данных.
Добавлено: 26 янв 2007, 17:32
StealthAIDS
Код: Выделить всё
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
Кажется, так?
Добавлено: 26 янв 2007, 17:43
bender
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)
...
А это зачем? Вроде все работает без этого куска кода?
Добавлено: 26 янв 2007, 18:03
Merlin
Ндя. Дайте две (С). Думать лучше головом, а не пальцами рук на клаве.
Добавлено: 26 янв 2007, 18:19
WildSery
Бендер, прочитай ещё раз статью про джойны, особенно место, где советуют не смешивать явные и неявные.
Добавлено: 26 янв 2007, 20:15
StealthAIDS
bender писал(а):А это зачем? Вроде все работает без этого куска кода?
Есть такое поняие - "самокомментируемость"(с)неизвестный автор (или "Читаемость кода", если по-русски)
Добавлено: 29 янв 2007, 10:37
bender
WildSery, я понял свою ошибку, исправил к такому виду, теперь правильно построил запрос?
Код: Выделить всё
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
2StealthAIDS я сказал насчет лишнего куска, потому что у тебя в запросе смешалось два запроса и причем тут самокоментируемость?
Добавлено: 29 янв 2007, 11:32
WildSery
Так лучше

Теперь хорошенько подумай, нужен ли тебе именно LEFT join.
Добавлено: 29 янв 2007, 12:04
bender
Ну насколько я понял, LEFT JOIN в моем случае нужен только если в записях таблицы D будут содержаться не все индексы ссылающиеся на записи из таблиц P1, P2 и M. Так?
А что JOIN будет работать быстрее чем LEFT JOIN, если из правых таблиц придется выбирать все записи?
Добавлено: 29 янв 2007, 12:23
kdv
Ну насколько я понял, LEFT JOIN в моем случае нужен только если в записях таблицы D будут содержаться не все индексы ссылающиеся на записи из таблиц P1, P2 и M. Так?
какие, блин, индексы?
А что JOIN будет работать быстрее чем LEFT JOIN, если из правых таблиц придется выбирать все записи?
читай тут. потом подумай над своими вопросами.
www.ibase.ru/devinfo/joins.htm
Добавлено: 29 янв 2007, 13:50
bender
Не так выразился, я не имел в виду индексы в понимании терминологии Firebird сервера, а подразумевал столбец ID в таблице D. Ладно забейте, спасибо за помощь, болше вопросов не имею... хотя остался вопрос, почему при выполнении этого запроса:
Код: Выделить всё
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
NULL записи (в отсортированном столбце PTR_NAME) идут в начале, а не в конце. Я юзаю Firebird 1.0.x