Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2011, 00:26   #1
S.V.D.
 
Регистрация: 22.01.2010
Сообщений: 6
Печаль Разъединить записи

Здравствуйте!
Имею запрос при котором выполняется поиск и объединение количества записей с одинаковым IdT.
И соответственно удаляем лишние (исходные) записи.
Код:
    TMP.SQL.Text := 'select min(id) as id, sum(kol) as kol, count(*) as cnt from "'+tablename+'" group by IdT';
    TMP.Open;
    TMP.First;
    while not TMP.Eof do begin
      tmpQuery.SQL.Text := 'update "'+tablename+'" set kol = ' + TMP.FieldByName('kol').AsString
                                + ' where id = ' + TMP.FieldByName('id').AsString;
      tmpQuery.ExecSQL;

      TMP.Next;
    end;

    repeat
      TMP.Close;
      TMP.SQL.Text := 'select max(id) as id from "'+tablename+'" group by IdT having count(*) > 1';
      TMP.Open;
      TMP.First;
      while not TMP.Eof do begin
        tmpQuery.SQL.Text := 'delete from "'+tablename+'" where id = ' + TMP.FieldByName('id').AsString;
       tmpQuery.ExecSQL;

        TMP.Next;
      end;
    until TMP.RecordCount = 0;
Помогите пожалуйста с обратной функцией - где ищем IdT записи с количеством > 1, делаем новые записи c kol=1 (количество записей зависит от значения Kol > 1) и после удаляем исходную строку с kol>1.

пример:
имеем
Код:
    
  id      Idt    kol
  1      123    3
  2      234    1
необходимо
Код:
    
  id      Idt    kol
  2      234    1  
  3      123    1
  4      123    1
  5      123    1
S.V.D. вне форума Ответить с цитированием
Старый 09.01.2011, 13:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И соответственно удаляем лишние (исходные) записи.
А зачем? Насколько я знаю группировка распространенное явление, и смысла в удалении после группировки нет никакого. Даже для экономии места это не дает никакого эффекта, ибо удаляемые записи таки остаются физически в базе в 90% случаев, пока не будет запущен уборщик мусора базы, но с ним работают не часто.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2011, 17:53   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Помогите пожалуйста с обратной функцией
Код:
SQL select  // -где ищем IdT записи с количеством > 1, 
while not EOF do
begin

while kol>1 do
begin
  sql insert //делаем новые записи c kol=1 
  kol=kol-1; // (количество записей зависит от значения Kol > 1) 
end;
  
// и после удаляем исходную строку с kol>1.

end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.01.2011, 19:08   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

тема явно имеет отношение не к SQL - а к "БД в Delphi"
куда и переезжает...

Модератор.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.01.2011, 21:34   #5
S.V.D.
 
Регистрация: 22.01.2010
Сообщений: 6
По умолчанию

Код:
   TMP.SQL.Text := 'select Id from "'+tablename+'" where kol>1';
    TMP.Open;
 while not TMP.Eof do begin

while kol>1 do

begin

        tmpQuery.SQL.Text:='INSERT INTO "'+tablename+'" (Idt, kol) VALUES('
                        +TMP.FieldByName('Idt').asstring+'", 1)';
                        tmpQuery.ExecSQL;
        TMP.Next;

  kol=kol-1; // (количество записей зависит от значения Kol > 1) не понятно как реализовать условие, при котором он запишет столько строк сколько равно значению kol
end;
Прошу помощи.

Последний раз редактировалось S.V.D.; 10.01.2011 в 10:45.
S.V.D. вне форума Ответить с цитированием
Старый 09.01.2011, 22:05   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну примерно так (пишу прямо здесь, возможны опечатки, мелкие неточности и ошибки):
Код:
 TMP.SQL.Text := 'select Id, idt, kol from "'+tablename+'" where kol>1';
 TMP.Open;
 while not TMP.Eof do begin
   Kol := TMP.FieldByName('Idt').AsInteger;
   while kol>=1 do  begin
     tmpQuery.SQL.Text:='INSERT INTO "'+tablename+'" (Idt, kol) VALUES('
                   +TMP.FieldByName('Idt').asstring+'", 1)';
     tmpQuery.ExecSQL;
     kol=kol-1; 
   end;

   // тут надо удалить исходную запись 
   tmpQuery.SQL.Text := 'DELETE FROM "'+tablename+'" where id = '+
                            TMP.FieldByName('Id').AsString;
   tmpQuery.ExecSQL;

   // пошли на следующую запись с kol>1
   TMP.Next;
 end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.01.2011, 21:22   #7
S.V.D.
 
Регистрация: 22.01.2010
Сообщений: 6
По умолчанию

Итак, подправил и сделал рабочий код.
Не смог добиться синхронности и корректности при одновременной обработке insert и delete, поэтому сделал через finally.
Спасибо всем кто помог словом и делом.
Код:
       try
  TMP.SQL.Text := 'select * from "'+tablename+'" where kol>1';
   TMP.Open;

 while not TMP.Eof do begin
    Kol := TMP.FieldByName('kol').AsInteger;

  while kol>=1 do  begin

        tmpQuery.SQL.Text:='INSERT INTO "'+tablename+'" (Idt, kol) VALUES('''
                        +TMP.FieldByName('Idt').asstring+''', 1)';
                       tmpQuery.ExecSQL;

      kol:=kol-1;
end;
     TMP.Next;
    end;

   finally
   TMP.SQL.Text := 'select * from "'+tablename+'" where kol>1';
   TMP.Open;

    while not TMP.Eof do begin
        tmpQuery.SQL.Text := 'delete from "'+tablename+'" where id = ' + TMP.FieldByName('id').AsString;
        tmpQuery.ExecSQL;
        TMP.Next;
    end;

  end;
S.V.D. вне форума Ответить с цитированием
Старый 11.01.2011, 09:50   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну... это не серьёзно.
Раз уж Вы хотите удалить ВСЕ записи, где KOL>1
ну так и удаляйте их.
Зачем ещё цикл ненужный?!

вместо того, что у Вас в finally
достаточно двух строк кода:
Код:
   tmpQuery.SQL.Text := 'delete from "'+tablename+'" where kol > 1';
   tmpQuery.ExecSQL;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2011, 17:13   #9
S.V.D.
 
Регистрация: 22.01.2010
Сообщений: 6
По умолчанию

Спасибо, справедливо. Сам я "зациклился" - упустил из виду.
S.V.D. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записи DrDre9991 Паскаль, Turbo Pascal, PascalABC.NET 2 23.06.2010 11:09
Записи DRAgon™ Паскаль, Turbo Pascal, PascalABC.NET 3 17.06.2010 22:13
записи Cepgeich Помощь студентам 2 23.04.2010 11:03
записи Bapr Помощь студентам 0 30.03.2010 22:09
Объединенные поля. Как разъединить? ***DSL*** Помощь студентам 0 02.06.2008 16:39