Форум: "Базы";
Текущий архив: 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 сейчас? а до этого и другое. ну так здесь не ликбез, тебя любимого, другим развлечься тоже нужно.
- если ты такой умный чего же ты строем не ходиш?
а вот не буду. не хочу и не буду.
← →
VID © (2004-08-09 22:55) [41]sniknik © (09.08.04 22:12) [40]
Бывает период когда человек воспринимает только прямые ответы, он ещё не готов саморазвиваться, "видеть между строк" и тому подобное. Ему просто нужен код. Просто я сам прошёл через такой этап, и сколь сильно это бесит мастеров столь сильно это необходимо новичкам.
Лично мне в своё время в период активного изучения мною Interbase помогал один мой друг через интернет, и чаще всего методом "прямого ответа" - т.е. код давал. Это было на самом начальном этапе, и я бездумно использовал этот код говоря спасибо и развивая проект дальше.
А потом стали возникать вопросы: Почему это именно так работает, и что если.... Как правило эти вопросы возникли, когда полученный код после некоторого использования требовалось всё-таки немного модифицировать. Вот на этом этапе новичёк готов к анализу советов.
Поэтому, лично тебе, я хочу посоветовать быть не столь категоричным в этом отношении. Тем более что ты можешь и то и другое: дать совет или просто подкинуть готовое решение.
В конце-концов, ведь не зря в гостевой книге готовых решений для дельфи (UBPFD) столько благодарных отзывов.
ИМХО.
← →
sniknik © (2004-08-09 23:40) [42]VID © (09.08.04 22:55) [41]
думаеш я издеваюсь? мне кажется наоборот.
вот тебе один для примера
http://delphimaster.net/view/3-1092079761/
дай ему прямой ответ. (счастье если даш ссылку на UBPFD и он сам разберется, но боюсь этого не будет)
← →
VID © (2004-08-09 23:55) [43]Дык, какой же ему прямой ответ дать, если он прямого и конкретного вопроса не задал :) что за инфу...
впрочем, я всё равно ничем не смог бы помочь, я акцесс обошёл стороной.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.65 MB
Время: 0.037 c