Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.037 c
3-1092168310
Zif
2004-08-11 00:05
2004.09.05
Можно ли в ADOQuery соединить несколько таблиц?


14-1092343375
pasha_golub
2004-08-13 00:42
2004.09.05
Литература vs Кинематограф


4-1090315529
maguk
2004-07-20 13:25
2004.09.05
Вопрос по RichEdit 2.0


8-1087720665
tamagavk
2004-06-20 12:37
2004.09.05
Подскажите текст программы, а может только процедуру


3-1092309455
strelok-47
2004-08-12 15:17
2004.09.05
проблема с лукапами в ADODataSet е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский