![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка записей [D7, IB5.x]
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
"
Запрос конечно громоздкий получится, но при формировании его в автоматическом режиме это не проблема, и во-всяком случае он идеально решает свою задачу.