Сортировка по Lookup полю

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сортировка по Lookup полю

Сообщение bender » 25 янв 2007, 17:47

Извиняюсь, если этот вопрос уже обсуждался, (я прочитал некоторые темы) но он так и остался для меня непонятным.

Имеется запрос:
select NAME_ID, (select ID, NAME from B where B.ID=A.NAME_ID) as NAME FROM A
добавить к этому запросу ORDER BY NAME насколько я понимаю нельзя. Так как же мне отсортировать данные по полю NAME (оно символьное и сортировка должна быть в алфавитном порядке).

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 25 янв 2007, 17:48

сорри за второй топ, сервак глюкнул

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 25 янв 2007, 17:51

И на каком же сервере у тебя работает сей запрос?

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 25 янв 2007, 18:08

Сорри погорячился, вот так:
select NAME_ID, (select NAME from B where B.ID=A.NAME_ID) as NAME FROM A

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 янв 2007, 18:41

Отсортировать-то нефиг делать, но лучше научиться джойнить.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 25 янв 2007, 18:49

Прочитай документацию по ORDER BY, она умеет сортировать не по имени поля.
Так же прочитай про JOIN

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 26 янв 2007, 14:41

А как заджойнить такую ситуацию:

есть таблица 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 должны располагаться в конце набора данных, а получается, что они отображаются в начале.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 янв 2007, 15:12

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 по вкусу.
классическая задача "покупатель и поставщик в одной таблице"

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 26 янв 2007, 15:22

bender писал(а):А как заджойнить такую ситуацию:
Что такое алиас таблиц в запросе разобрался?
Тогда несложно - в одном селекте можно одну и ту же таблицу присоединять многократно с разными алиасами.

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 26 янв 2007, 16:51

Разобрался (не с той стороны таблицы всавлял :) ) Получилось вот что:

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.

И еще по поводу сортировки, нулевые строки все равно идут в начале набора данных.

StealthAIDS
Сообщения: 15
Зарегистрирован: 10 янв 2007, 18:35

Сообщение StealthAIDS » 26 янв 2007, 17:32

Код: Выделить всё

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
Кажется, так?

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 26 янв 2007, 17:43

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)
...
А это зачем? Вроде все работает без этого куска кода?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 26 янв 2007, 18:03

Ндя. Дайте две (С). Думать лучше головом, а не пальцами рук на клаве.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 26 янв 2007, 18:19

Бендер, прочитай ещё раз статью про джойны, особенно место, где советуют не смешивать явные и неявные.

StealthAIDS
Сообщения: 15
Зарегистрирован: 10 янв 2007, 18:35

Сообщение StealthAIDS » 26 янв 2007, 20:15

bender писал(а):А это зачем? Вроде все работает без этого куска кода?
Есть такое поняие - "самокомментируемость"(с)неизвестный автор (или "Читаемость кода", если по-русски)

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 29 янв 2007, 10:37

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 я сказал насчет лишнего куска, потому что у тебя в запросе смешалось два запроса и причем тут самокоментируемость?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 29 янв 2007, 11:32

Так лучше :)
Теперь хорошенько подумай, нужен ли тебе именно LEFT join.

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 29 янв 2007, 12:04

Ну насколько я понял, LEFT JOIN в моем случае нужен только если в записях таблицы D будут содержаться не все индексы ссылающиеся на записи из таблиц P1, P2 и M. Так?
А что JOIN будет работать быстрее чем LEFT JOIN, если из правых таблиц придется выбирать все записи?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 янв 2007, 12:23

Ну насколько я понял, LEFT JOIN в моем случае нужен только если в записях таблицы D будут содержаться не все индексы ссылающиеся на записи из таблиц P1, P2 и M. Так?
какие, блин, индексы?
А что JOIN будет работать быстрее чем LEFT JOIN, если из правых таблиц придется выбирать все записи?
читай тут. потом подумай над своими вопросами.
www.ibase.ru/devinfo/joins.htm

bender
Сообщения: 37
Зарегистрирован: 24 фев 2005, 15:41

Сообщение bender » 29 янв 2007, 13:50

Не так выразился, я не имел в виду индексы в понимании терминологии 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

Ответить