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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2021, 22:49   #11
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Serega_SS Посмотреть сообщение
SELECT t1.*, t2.*, t3.*, t4.* FROM (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000) as t1
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000) as t2 on t1.[#]+15000 =t2.[#]
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 30001 and 45000) as t3 on t1.[#]+30000 =t3.[#]
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 45001 and 60000) as t4 on t1.[#]+45000 =t4.[#]
А если изменить на
Код:
SELECT t1.*, t2.*,  t3.*, t4.*  FROM (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000) as t1
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000) as t2 on (t1.[#]+15000) =t2.[#] 
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 30001 and 45000) as t3 on (t1.[#]+30000) =t3.[#]
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 45001 and 60000) as t4 on (t1.[#]+45000) =t4.[#]
т.е. t1.[#]+15000 заменить на (t1.[#]+15000) и проч?
Viktor61 вне форума Ответить с цитированием
Старый 25.03.2021, 07:02   #12
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Пробовал и так. Не хватает оператора.
Код:
begin
  if not OpenDialog1.Execute then exit;
  ADOConnection1.Close;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + OpenDialog1.FileName + ';User ID=Admin;Password=;Extended Properties=Excel 8.0';
  Label1.Caption:=ExtractFileName(OpenDialog1.FileName);
  ADOConnection1.Open;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT t1.*, t2.*, t3.* FROM (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000) as t1' + char(10) +
  'LEFT JOIN (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000) as t2 on (t1.[#]+15000) =t2.[#]' (ВОТ СЮДА НУЖЕН КАКОЙТО ОПЕРАТОР)  + char(10) +
  'LEFT JOIN (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 30001 and 45000) as t3 on (t2.[#]+15000) =t3.[#]');
  ADOQuery1.Open;
end;
пока нет третей строки все норм, как появляется еще одна строка пишет не хватает оператора.
Serega_SS вне форума Ответить с цитированием
Старый 25.03.2021, 10:45   #13
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Если делаю так
Код:
begin
  if not OpenDialog1.Execute then exit;
  ADOConnection1.Close;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + OpenDialog1.FileName + ';User ID=Admin;Password=;Extended Properties=Excel 8.0';
  Label1.Caption:=ExtractFileName(OpenDialog1.FileName);
  ADOConnection1.Open;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT t1.*, t2.* FROM (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000) as t1' + char(10) +
  'LEFT JOIN (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000) as t2 on (t1.[#]+15000) =t2.[#]');
  ADOQuery1.Open;
end;
Все работает правильно
Serega_SS вне форума Ответить с цитированием
Старый 25.03.2021, 10:48   #14
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Можно так сделать
Код:
begin
  if not OpenDialog1.Execute then exit;
  ADOConnection1.Close;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + OpenDialog1.FileName + ';User ID=Admin;Password=;Extended Properties=Excel 8.0';
  Label1.Caption:=ExtractFileName(OpenDialog1.FileName);
  ADOConnection1.Open;
  ADOQuery1.SQL.Clear;
  ADOQuery2.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT t1.*, t2.* FROM (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 1 and 15000) as t1' + char(10) +
  'LEFT JOIN (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 15001 and 30000) as t2 on (t1.NUM+15000) = t2.NUM');

  ADOQuery2.SQL.Add('SELECT t3.*, t4.* FROM (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 30001 and 45000) as t3' + char(10) +
  'LEFT JOIN (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 45001 and 60000) as t4 on (t3.NUM+15000) = t4.NUM');
  ADOQuery1.Open;
  ADOQuery2.Open;
end;
только как теперь их собрать в одну ДБ
Serega_SS вне форума Ответить с цитированием
Старый 25.03.2021, 11:54   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

а так ?..
Код:
select t12.*, t34.*
from ( --- 1 
          select t1.*, t2.* ...
       ) as t12
left join ( ---2
              select t3.*, t4.* ...
            ) as t34 on t12.... =t34.....
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 25.03.2021, 13:13   #16
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а так ?..
Код:
select t12.*, t34.*
from ( --- 1 
          select t1.*, t2.* ...
       ) as t12
left join ( ---2
              select t3.*, t4.* ...
            ) as t34 on t12.... =t34.....
Не понимаю как обратится к Adoquery1, чтобы запросить данные т1 и т2
Serega_SS вне форума Ответить с цитированием
Старый 25.03.2021, 15:43   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

нет просто написать ОДИН большой
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 26.03.2021, 06:13   #18
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
нет просто написать ОДИН большой
Спасибо тебе дружище!
Все получилось, только очень замудренно.
Думаю есть варианты по проще. Просто если надо будет поделить на 20 частей, мозг лопнет.
Пока буду использовать так, походу может быть найду другой вариант.
Еще раз спасибо.
Вот такой код получился у меня.
Код:
ADOQuery1.SQL.Add('SELECT t10.*, t20.*  FROM' + char(10) +
                          '(SELECT t1.*, t2.* FROM (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 1 and 15000) as t1' + char(10) +
                          'LEFT JOIN (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 15001 and 30000) as t2 on (t1.NUM+15000) = t2.NUM) as t10' + char(10) +

                    'LEFT JOIN'  + char(10) +
                          '(SELECT t3.*, t4.* FROM (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 30001 and 45000) as t3' + char(10) +
                          'LEFT JOIN (SELECT * FROM [Лист1$] WHERE NUM BETWEEN 45001 and 60000) as t4 on (t3.NUM+15000) = t4.NUM) as t20 on (t10.t1.NUM +30000) = t20.t3.NUM');
Serega_SS вне форума Ответить с цитированием
Старый 26.03.2021, 08:13   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

а попробуй так
Код:
SELECT t1.*, t2.*,  t3.*, t4.*  
FROM ( ( [Лист1$] as t1 
         left join [Лист1$] as t2 on t1.[#] +15000 =t2.[#]
       ) left join [Лист1$] as t3 on t1.[#] +30000 =t3.[#]
     )   left join [Лист1$] as t4 on t1.[#] +45000 =t4.[#]

where t1.[#] between 1 and 15000
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 26.03.2021, 10:30   #20
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а попробуй так
Так тоже сработало
Код:
ADOQuery1.SQL.Add('SELECT t1.*, t2.*,  t3.*, t4.* FROM ( ( [Лист1$] as t1' + char(10) +
         'left join [Лист1$] as t2 on t1.NUM +15000 =t2.NUM)' + char(10) +
         'left join [Лист1$] as t3 on t1.NUM +30000 =t3.NUM)' + char(10) +
         'left join [Лист1$] as t4 on t1.NUM +45000 =t4.NUM' + char(10) +
         'where t1.NUM between 1 and 15000');

Последний раз редактировалось Serega_SS; 26.03.2021 в 10:46.
Serega_SS вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGrid, ADOQuery(обьединение двух таблиц) Delphi_ProGer БД в Delphi 3 21.12.2013 20:13
Слияние двух AdoQuery в одном DBGrid Марк Охман БД в Delphi 3 17.12.2010 21:27
ADOQuery и несколько DBGrid Leiph БД в Delphi 3 02.07.2010 16:57
DBGRID + ADOQuery - сортировка Dux БД в Delphi 4 15.06.2009 13:45
Обновление DBGrid + ADOQuery Demonk БД в Delphi 11 04.02.2009 13:42