Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка записей [D7, IB5.x]


Страницы:   1 2 3

Shade ©   (2004-08-08 11:19:00) 

Знает кто нибудь как вывести записи в нужном мне порядке?, например по ID= 3,12,5... Ну короче этот список известен, и дан либо в строке, либо в массиве.
 Через 'ORDER BY' никак не получается, 'IN' воспринимается как множество... Подгружать по одной записи тоже не вышло. ВЫРУЧАЙТЕ ПРОГРАММЕРЫ!!!


VID   (2004-08-08 18:07:00) [21]

блин... мне стыдно :( я не знал про опцию ALL в конструкции UNION :(....
ведь в таком случае не нужно вообще никакое доп. поле, а тем более доп. таблица (кстати, откуда ты взял доп. таблицу, я о ней и не заикался).

Люди, подскажите где в инете можно найти описание всех SQL-конструкций на русском языке, буду штудировать блин :(

Дайте пожалуйста прямой линк......


sniknik   (2004-08-08 18:07:00) [22]

> Не посчитайте меня вредным, но:
посчитаю, сам такой
> имело ввиду создание в таблице Table1 доп. поля и перед вызовом этого "особенного" запроса, предполагалось про-update'ить ...
где сказано? если в моем прочитал ([9]) то читай все ->> не обязательно в базе, можно в рекордсете на клиенте.

> не допускает использования сортировки Order by по какому-бы то ни было полю
правда? специально проверил (правда у меня яфил, ib ставить для проверок тоже лом )
нормально, допускает и сортирует

SELECT a.SPOUSE, 2 AS ORD FROM CONTACTS2 AS a
UNION ALL
SELECT a.SPOUSE, 1 AS ORD FROM CONTACTS2 AS a
ORDER BY 2


sniknik   (2004-08-08 17:52:00) [23]

а зачем дополнительная таблица? без этого можно (если говорить о MSSQL)
проверь (хотя если честно не понимаю зачем убирать поле определяюшее сортировку, просто не показывать его в визуальных компанентах)

SELECT sort FROM table1 WHERE sort=14
UNION ALL
SELECT sort FROM table1 WHERE sort=6
UNION ALL
SELECT sort FROM table1 WHERE sort=2
UNION ALL
SELECT sort FROM table1 WHERE sort=3

(ALL обязателен, без него будет выполнена проверка на дублирующие записи для которой строится индекс)


VID   (2004-08-08 17:51:00) [24]

>>sniknik ©   (08.08.04 17:39) [18]

Не посчитайте меня вредным, но:

Во-первых, когда речь шла о доп.поле (пусть AditionalField),  имело ввиду создание в таблице Table1 доп. поля, и перед вызовом этого "особенного" запроса, предполагалось про-update'ить нужные записи этой таблицы таким образом что бы потом просто выполнить запрос
Select * from table1 where id in (3,12,4) order by AditionalField; А это совсем другое, в отличии от того что предложил AndB. Впрочем, если ты имел ввиду имено то доп. поле которое предложил AndB то, сорри, значит я не понял.

Во-вторых, в одном из твоих постов, ты сказал что не разбираешься хорошо в IB , так вот  запрос типа
Select <fields> from <table>
union
Select <fields> from <table>
...
не допускает использования сортировки Order by по какому-бы то ни было полю, ни в каком из этих двух запросов. Вот поэтому я сказал что он был  ПОЧТИ прав.

AndB молодец, он подал идею, а я всего лишь немножко её привёл к требованиям IB-сервера.


сергей1   (2004-08-08 17:39:00) [25]

да не, у меня все так сработало, молодец AndB, единственное, что надо бы убрать лишний столбец, на MS SQL это может выглядеть так :

SELECT sort, 1 AS ord into #t FROM table1 WHERE sort=14
UNION
SELECT sort, 2 AS ord FROM table1 WHERE sort=6
UNION
SELECT sort, 3 AS ord FROM table1 WHERE sort=2
UNION
SELECT sort, 4 AS ord FROM table1 WHERE sort=3
ORDER BY ord

select sort from #t

drop table #t

здесь на выходе появляется только отсортированный столбец sort


sniknik   (2004-08-08 17:39:00) [26]

VID ©   (08.08.04 15:42) [11]
> Да плохой это вариант с доп. полем.. плохой...

VID ©   (08.08.04 17:25) [17]
> Но если сделать так:
> select 1 as ord, ...

ord дополнительное поле, специально для сортировки. ;о)))

> Ты оказался почти прав !
почему почти? в AndB ©   (08.08.04 16:41) [16] вполне рабочий вариант и даже более правильный (нет допущения что неявная сортировка по первому полю. а вдруг нет?), у него же явно указано по какому сортировать.


VID   (2004-08-08 17:25:00) [27]

AndB ©   (08.08.04 16:41) [16]
Ты оказался почти прав !

только вот Order by ORD в данном случае не был принят сервером invalid ORDER BY clause.

Но если сделать так:

select 1 as ord, table1.* from table1 where id = 12
union
select 2 as ord, table1.* from table1 where id = 3

то всё работает как надо, потому что сортировка автоматически происходит по первому полю, а оно у нас как раз для этого и создано.


AndB   (2004-08-08 16:41:00) [28]

ну уж такой-то вариант должен сработать:
SELECT numb, txt, 1 AS ord FROM tabl1 WHERE numb=8
UNION
SELECT numb, txt, 2 AS ord FROM tabl1 WHERE numb=2
UNION
SELECT numb, txt, 3 AS ord FROM tabl1 WHERE numb=43
UNION
SELECT numb, txt, 4 AS ord FROM tabl1 WHERE numb=5
ORDER BY ord;


AndB   (2004-08-08 16:35:00) [29]

не-е.. :) это я тупой. оказалось я их забил в такой последовательности. совпадение. :))


сергей1   (2004-08-08 16:10:00) [30]

может я конечно тупой, но не понимаю, почему
SELECT * FROM table1 WHERE numb=4 or numb=2 or numb=64 or numb=43 or numb=5

должно работать, он же опять все по возрастанию индекса переделает

>что делать ? и если они одновременно запросят данные...
в принципе блокировки же есть, хотя если таблицы большие...
но это все равно лучше чем у меня с моей второй таблицей


AndB   (2004-08-08 16:06:00) [31]

аа-а.. sorry. Вчитался. Тогда так
WHERE numb=4 or numb=2 or numb=64 or numb=43 or numb=5
(поле индексированное)


AndB   (2004-08-08 15:53:00) [32]

[9]> да брось ты, никак. для аксесс к примеру можно
для Access можно и попроще:
SELECT * FROM tabl1 WHERE numb IN (4,2,64,43,5) ORDER BY numb
для MSSQL тоже. Неужто IB5 такой вредный? или вы о шахматах?


VID   (2004-08-08 15:42:00) [33]

Да плохой это вариант с доп. полем.. плохой... А если многопользовательская система, и одному нужен порядок
3,12,5, 4
а другому
4,5,12,3
что делать ? и если они одновременно запросят данные...


сергей1   (2004-08-08 15:31:00) [34]

рад, что хоть где-то это можно, если знаете как для MS SQL, то скажите, интересно. А дополнительное поле неплохой вариант, правда если порядок все время меняется, запаришься update'ить


sniknik   (2004-08-08 15:15:00) [35]

> наверно никак
да брось ты, никак. для аксесс к примеру можно
SELECT * FROM Table1 ORDER BY iif(Field1=3, 1, iif(Field1=12, 2, iif(Field1=5, 3, 99)))

для IB тоже можно чегонибудь придумать, там возможностей больше, (самому сформировать рекордсет в процедуре в нужном порядке например)
с IB знаком плохо, т.что пусть пример дает тот кому это легко.

можно сделать универсально, держать поле специально для определения порядка, раз уж так нестандартно. не обязательно в базе, можно в рекордсете на клиенте.

а вообще действительно как насчет [1]? за деньги даже с моим слабым знанием IB взялся бы, и хелп по нему прочитать в этом случае не в лом. главное предложите достаточно...


VID   (2004-08-08 15:03:00) [36]

тупой UNION... совсем огорчил меня, я ж тоже все свои книги и пол-инета перерыл и не нашёл ничего :((((


сергей1   (2004-08-08 15:01:00) [37]

наверно никак, в хелпе никаких дополнительных опций к нему по сортировке нет, причем он сортирует даже если никаких индексов и ключей вообще не определено, берет и делает сортировку по первому полю.


VID   (2004-08-08 14:44:00) [38]

чёрт побери, результат запроса
select * from tabl1e where id = 3
union
select * from table1 where id = 12
union
select * from table1 where id = 5
действительно возвращается в сортированном виде, если на поле id наложен индекс...

а как же быть ? как сделать так, что бы UNION объединял результаты этих запросов и не сортировал их по индексу...


сергей1   (2004-08-08 13:07:00) [39]

отчасти ты конечно прав, только вот если ты запустишь такой запрос в MS SQL, он тебе результат все равно отсортирует по ключу. Конечно, может быть в IB это не так, не знаю. А так-то я согласен, что копировать в другую таблицу это нехорошо, известно, что нельзя полагаться на физический порядок записей, но в MS SQL это канает, если Table2 не содержит никаких ключей,
возможно, лучше здесь использовать табличную переменную (опять-таки не знаю, есть такое в IB или нет)


VID   (2004-08-08 12:48:00) [40]

сергей1   (08.08.04 12:00) [3]
Постой, постой... Ты предлагаешь по одной записи, копироватьданные из одной таблицы в другу ? Ну знаешь ли...
Имхо, человеку, не нужна вторая таблица, ему нужен запрос который сразу при своём выполнении вернёт записи в нужном ему порядке.

Может быть такой запрос подойдёт
"
select * from tabl1e where id = 3
union
select * from table1 where id = 12
union
select * from table1 where id = 5
"

Запрос конечно громоздкий получится, но при формировании его в автоматическом режиме это не проблема, и во-всяком случае он идеально решает свою задачу.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо