Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Сортировка записей   Найти похожие ветки 

 
Shade   (2004-08-08 11:19) [0]

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


 
Anatoly Podgoretsky ©   (2004-08-08 11:52) [1]

Действительно, а почему бы вам не пригласить программиста?


 
сергей1   (2004-08-08 11:58) [2]

вот так:

procedure TForm1.Button1Click(Sender: TObject);
var m:array[1..10] of integer;
   i:integer;
begin
m[1]:=6;
m[2]:=3;
m[3]:=2;
m[4]:=14;
for i:=1 to 4 do
begin
 form1.ADOQuery4.SQL.Text:="insert into Table2 select * from   Table1 where Table1.sort = " + inttostr(m[i]);
 form1.ADOQuery4.ExecSQL;
end;
end;

здесь обьявлен массив m[1..4], в него занесен порядок чисел.
Table1.sort это то поле, по которому производится сортировка
В результате, в Table2 окажется то, что нужно


 
сергей1   (2004-08-08 12:00) [3]

забыл сказать, что это версия для MS SQL, для IB вместо ADOQuery
используй IBQuery


 
VID ©   (2004-08-08 12:48) [4]

сергей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   (2004-08-08 13:07) [5]

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


 
VID ©   (2004-08-08 14:44) [6]

чёрт побери, результат запроса
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 15:01) [7]

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


 
VID ©   (2004-08-08 15:03) [8]

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


 
sniknik ©   (2004-08-08 15:15) [9]

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

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

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

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


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

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


 
VID ©   (2004-08-08 15:42) [11]

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


 
AndB ©   (2004-08-08 15:53) [12]

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


 
AndB ©   (2004-08-08 16:06) [13]

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


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

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

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

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


 
AndB ©   (2004-08-08 16:35) [15]

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


 
AndB ©   (2004-08-08 16:41) [16]

ну уж такой-то вариант должен сработать:
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;


 
VID ©   (2004-08-08 17:25) [17]

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

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


 
sniknik ©   (2004-08-08 17:39) [18]

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] вполне рабочий вариант и даже более правильный (нет допущения что неявная сортировка по первому полю. а вдруг нет?), у него же явно указано по какому сортировать.


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

да не, у меня все так сработало, молодец 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


 
VID ©   (2004-08-08 17:51) [20]

>>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-сервера.


 
sniknik ©   (2004-08-08 17:52) [21]

а зачем дополнительная таблица? без этого можно (если говорить о 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 18:07) [22]

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

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

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


 
sniknik ©   (2004-08-08 18:07) [23]

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


 
сергей1   (2004-08-08 18:21) [24]

получается что я нихрена не знаю union, но пусть мне кто-нибудь обьяснит, почему запрос у sniknik возращает правильный результат, ведь добавив all, мы всего-то должны были получить все записи, какое это имеет отношение к сортировке, ведь этот запрос и в самом деле все отсортировал правильно


 
VID ©   (2004-08-08 18:27) [25]

сергей1   (08.08.04 18:21) [24]
На твой вопрос кажется я смогу ответить, хотя я уже вовсю сомневаюсь в своей компетентности....

Когда отсутствует опция ALL сервер проводит исключение ДУБЛИРУЮЩИХСЯ записей, а ему это легче сделать если предваритально осортировать весь набор строк. Поэтому остуствие ALL явно исключает дублирование, а неявно ещё и сортирует набор данных.


 
сергей1   (2004-08-08 18:31) [26]

да... век живи век учись !

а в по хелпу об этом и не догадаться


 
Johnmen ©   (2004-08-08 20:53) [27]

>VID ©  
>сергей1

Кстати, поведение UNION с предикатом ALL или без оного достаточно понятно описано в стандарте SQL.

"Ищущий да обрящет" (c)

(08.08.04 15:03) [8]


 
сергей1   (2004-08-08 20:56) [28]

эх, был бы этот стандарт под рукой, но ничего, куплю нормальный справочник, часть проблем надеюсь уйдет


 
Shade   (2004-08-08 21:03) [29]

Не знал, что в запросе можно два раза select использовать. Сейчас попробую. А так спасибо всем кто ответил :))) КРУТЫЕ ПРОГРАММЕРЫ!!!


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

ну почему два, хоть 100, в данном случае столько, сколько там у тебя строк


 
VID ©   (2004-08-08 21:36) [31]

Shade   (08.08.04 21:03) [29]
Я надеюсь ты просёк, что сам текст запроса надо формировать автоматически ? ;)


 
Shade   (2004-08-08 23:23) [32]

Блин мужики ВЫ ВООБЩЕ КРУТЫЕ. Я дней пять клавиатупу на этом грыз. Но тут ещё проблема есть небольшая

Всё конечно хорошо, и прекрасно работает а именно:

 for ord := 1 to n do begin
   Query.SQL.Add( "SELECT " + IntToStr( ord ) + " AS ord," );
   Query.SQL.Add( "TABLE1.DATA," );
   Query.SQL.Add( "TABLE2.DATA" );
   Query.SQL.Add( "FROM TABLE1, TABLE2 " );
   Query.SQL.Add( "WHERE TREE.ID=" + IntToStr( mas[ord] ) + " AND TABLE1.ID=TABLE2.ID_ITEM" );
   Query.SQL.Add( "UNION" );
 end;
 Query.SQL.Delete( Query.SQL.Count - 1 );

Но дело в том, что у TABLE2 есть свой ID и вторая таблица
(пририсовываясь к первой) выводится чёрт знает в каком порядке. :(
А если в конце приписать строчки типа:

 Query.SQL.Add("ORDER BY ord, TABLE2.ID");

или просто:

 Query.SQL.Add("ORDER BY TABLE2.ID");

То выводится ошибка:
"
Dynamic SQL Error
SQL error code = -104
Invalid command
invalid ORDER BY clause.
"

Короче при таком объединении запросов "ORDER BY" вообще не воспринимается.
Что хоть примерно можно в этом случае поделать???


 
sniknik ©   (2004-08-08 23:28) [33]

можно почитать книги, можно хелп, на крайняк перечитать свой же топик, ответ уже был.


 
sniknik ©   (2004-08-08 23:31) [34]

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


 
Shade   (2004-08-08 23:36) [35]

sniknik ©, Молодец очень умно. Может вообще тогда форум весь закрыть нафиг и вместо него объявы программеров вывесить?

Теперь по вопросу:
Может как нибудь вложенный запрос на внутреннюю таблицу замутить?


 
sniknik ©   (2004-08-08 23:50) [36]

правильно, это самая умная мысль во всем топике. (о принятии программиста на работу)

а теперь по вопросу:
а есть ли вопрос? чемулибо ничто не поможет если чтонибудь замутить. запомни, это аксиома.

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


 
VID ©   (2004-08-09 01:37) [37]

>>Короче при таком объединении запросов "ORDER BY" вообще не воспринимается.
>>Что хоть примерно можно в этом случае поделать???

в Order by указывай не имена полей а их порядковые номера в результирующем запросе.

короче.

в твоём случае всё что ты хочешь должно выглядеть так:

for ord := 1 to n do
begin
  Query.SQL.Add( "SELECT TABLE1.DATA, TABLE2.DATA, TABLE2.ID" );
  Query.SQL.Add( "FROM TABLE1, TABLE2" );
  Query.SQL.Add( "WHERE TREE.ID=" + IntToStr( mas[ord] ) + " AND TABLE1.ID=TABLE2.ID_ITEM" );
  if ord < n then Query.SQL.Add( "UNION ALL" );
end;
Query.SQL.Add("ORDER BY 3");


 
Sergey13 ©   (2004-08-09 09:17) [38]

2[35] Shade   (08.08.04 23:36)
Вот спорят все, спорят. А зачем сортировать по несортируемому, объясни? Так можно и картинки по содержимому "сортировать". ИМХО, у тебя проблемы в проектировании структуры.


 
Shade   (2004-08-09 21:44) [39]

VID
Тебе спасибо за ответ. Сейчас попробую!

Sergey13 ©
Ты не прав, проектирование у меня нормальное. К каждому изделию прилагается свой маршрут (изготовления по цехам). И поэтому без сортировки здесь никак (не будут же деталь красить если ещё фрезеровали :))) ).

А sniknik © если такой умный, то чем бы приколы загонять ответ бы написал. Всяк "братьям по оружию помагать нужно"!


 
sniknik ©   (2004-08-09 22:12) [40]

> А sniknik © если такой умный, то чем бы приколы загонять ответ бы написал. Всяк "братьям по оружию помагать нужно"!
а ты почитай внимательнее, я ведь помогал, но ты все успешно игнорировал... а второй раз одно и то же скушно.
или только прямые ответы воспринимаеш? тебя прямо ткнуть туда где я говорил тоже самое что и VID сейчас? а до этого и другое. ну так здесь не ликбез, тебя любимого, другим развлечься тоже нужно.

- если ты такой умный чего же ты строем не ходиш?
а вот не буду. не хочу и не буду.



Страницы: 1 2 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.052 c
1-1092988800
HSD
2004-08-20 12:00
2004.09.05
TFileStream добавление файла в конец


1-1093108838
Navi1982
2004-08-21 21:20
2004.09.05
Cos(x) и Sin(x) -- в чём дело?


14-1092834583
panov
2004-08-18 17:09
2004.09.05
Версия FreeBSD


14-1092334218
Николай
2004-08-12 22:10
2004.09.05
Можно ли скачать в Internet Delphi 7


1-1093033660
HydraMarat
2004-08-21 00:27
2004.09.05
Поток загружает процессор на 100%