Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивный запрос, не могу организовать 
:(
    Опции темы
Негодяй
  Дата 4.5.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



Хотел сделать пример по книге SQL, для сильно сомневающихся которая.

в Query на своей форме пишу:
Код

with RECURSIVE
 ReachableFrom (Source, Destination)
   as (select Source, Destination
            from FLIGHT
 union
     select in.Source, out.Destinaction
         from ReachableFrom in, FLIGHT out
        where in.Destination = out.Source)
select * from ReachableFrom
where Source="Portland";

запускаю приложение. В ответ ошибка - with писать нельзя, а без with - RECURSIVE тоже писать нельзя.

А что можно помогите как мне организовать рекурсивный запрос в Дельфи.

Вот такая таблица у мня FLIGHT:

Sourse Destination
_____________________
Portland Orange Country
Portland Charlotte
Portland Daytona Beach
Orange Country Montgomery
Charlotte Memphis
Memphis Champaign
Montgomery Memphis

А после рекурсии надо получить:

Sourse Destination
_______________
Portland Orange Country
Portland Charlotte
Portland Daytona Beach
Orange Country Montgomery
Charlotte Memphis
Memphis Champaign
Montgomery Memphis
Portland Montgomery
Portland Memphis
Orange Country Memphis
Chlotte Champaign


Мне нужно в Дельфи. Помогите??

Это сообщение отредактировал(а) Негодяй - 4.5.2005, 10:40
PM MAIL   Вверх
AntonSaburov
Дата 4.5.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Что за SQL используется ? Ибо что-то не встречал я такого синтаксиса - WITH RECURSIVE
PM MAIL WWW ICQ   Вверх
Негодяй
Дата 4.5.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



Цитата(AntonSaburov @ 4.5.2005, 11:05)
..что-то не встречал я такого синтаксиса - WITH RECURSIVE

а как тогда без него в Дельфи мою задачу решать?
PM MAIL   Вверх
AntonSaburov
Дата 4.5.2005, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Из твоего сообщения совершенно не понятно, что тебе надо получить. Таблица с одним полем - и при каком месте тут рекурсия ?
PM MAIL WWW ICQ   Вверх
Негодяй
Дата 4.5.2005, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



Цитата
..после рекурсии надо получить:

Sourse Destination
_______________
....
Portland Montgomery
Portland Memphis
Orange Country Memphis
Chlotte Champaign

Таблица FLIGHT - маршруты куда из какого города можно долететь.
Например: из Portland можно долететь в Orange Country, а из Orange Country в Montgomery.
А в ответе нужно вывести сразу что из Portland мы можно попасть в Montgomery.

Если написать только условие where source="Portland" - то ответа такого не получиться, что из Portland -> Montgomery.
PM MAIL   Вверх
AntonSaburov
Дата 4.5.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Так тебе надо решать задачку на графах - маршруты. Вообщем-то такие задачи обычно решаются несколько иначе - строится матрица связности. Я сейчас просто не могу вспомнить - надо в книжке посмотреть. Идея в том, что при добавлени города сразу строится полный список тех городов, которые будут ему доступны. Правда это требует памяти.

Хотя конечно можно это и рекурсией решить, но это не через один SQL-запрос.
Фактически надо делать функцию, на вход которой подается название города. По названию делаем запрос какие города доступны из этого города. И для каждого города из полученного списка опять же вызваем эту же функцию. Но это очень долгий процесс, если городов и связей много.

PM MAIL WWW ICQ   Вверх
Негодяй
Дата 4.5.2005, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



Цитата(AntonSaburov @ 4.5.2005, 12:15)
Хотя конечно можно это и рекурсией решить, но это не через один SQL-запрос.

не через один запрос, то есть придётся использовать 2 query.
PM MAIL   Вверх
Негодяй
Дата 4.5.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



а всё таки мой запрос вообще нельзя в Дельфи никак использовать smile
PM MAIL   Вверх
AntonSaburov
Дата 4.5.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Нет, не 2. Идея рекурсии ниже.
Пишу просто идею, поэтому алгоритм будешь реализовывать сам. Правда я сделал два поля вместо одного. Потому как так удобнее. Source - откуда, Target - куда

У тебя есть город начальный - CitySource и конечный CityTarget

Код

function ListCities(City : string; Path: TStrings): boolean;
var
  Query: TQuery;
begin
  Result := false;
  Query := TQuery.Create(nil);
  // Тут уже надо сделать инициализацию - коннекто к базе и прочая - это опущено
  Query.SQL.Add('SELECT Source, Target FROM Flight WHERE Source='+City);
  Query.Open;
  while not Query.EOF do
  begin
    // Нужный город достигнут
    if Query.Fields[1].AsString=CityTarget then
    begin
      // Добавляем в путь и говорим предыдущему вызову, что нашли
      Path.Items.Add(Query.Fields[1].AsString);
      Result := true;
      Query.Free;
      Exit;
    end;
    // В более низком уровне нешли нужный город
    if ListCities(Query.Fields[1].AsString) then
    begin
      // Добавляем в путь и говорим предыдущему вызову, что нашли
      Path.Items.Add(Query.Fields[1].AsString);
      Result := true;
      Query.Free;
      Exit;
    end;
    Query.Next;
  end;
  Query.Free;
end;


По идее у тебя в Path должны накопиться строки, которые будут составлять маршрут. Он возможно не будет самым оптимальным. Но он будет (если он возможен).

Если тебе надо оптимизировать это все - то надо такое спрашивать уже в форему Алгоритмы
PM MAIL WWW ICQ   Вверх
Негодяй
Дата 5.5.2005, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



Цитата
Правда я сделал два поля вместо одного.

у меня анолигичная таблица Flight (ReachableFrom - это временная таблица, создаваемая в самом запросом)
Цитата
Path: TStrings

а может имелось ввиду тип TListBox smile
Цитата
CityTarget

переменная неуказанная в функции, и на фигв она? smile
PM MAIL   Вверх
AntonSaburov
Дата 6.5.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Я так понял, что тебе надо задать город начальный и город конечный и получить маршрут из одного в другой.
Вот CitySource и CityTraget для этого и есть.

Или тебе нужно получить все возможные маршруты из какого-то города ? Тогда алгоритм менятеся но правта идея остается.

Я там кстати ошибку сделал - надо проверять, чтобы замкнутой цепочки не было.
PM MAIL WWW ICQ   Вверх
Негодяй
Дата 6.5.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



AntonSaburov
Огромное спасибо за попытки помочь, за идею, но знания в Дельфи у меня слабые, со списками поработаю and I'll come back smile
PM MAIL   Вверх
Негодяй
Дата 6.5.2005, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

Репутация: нет
Всего: 32



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

Код

procedure zapros(str:string);
var
Query: TQuery;
begin
Query := TQuery.Create(nil);
form1.DataSource1.DataSet:=query;
query.DatabaseName:='Airlines';
query.SQL.Add('select Source,Destination from FLIGHT where Source="'+str+'"');
query.Open;

while not Query.Eof do
begin

form1.ListBox2.Items.Add(Query.FieldByName('Destination').AsString);
Query.Next();
end;
query.SQL.Clear;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  Query: TQuery;
   i:integer;

  begin
  listbox1.Clear;
  Query := TQuery.Create(nil);
  datasource1.DataSet:=query;
  query.DatabaseName:='Airlines';
  query.SQL.Add('select Source,Destination from FLIGHT where Source="Orange Country"');
  query.Open;

while not Query.Eof do
 begin
listbox1.Items.Add(Query.FieldByName('Destination').AsString);
Query.Next();
end;
query.SQL.Clear;
for i:=0 to ListBox1.Items.Count-1 do
begin
zapros(ListBox1.Items.Strings[i]);
end;
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.