Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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


Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2021, 10:49   #21
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,250
По умолчанию

это запрос с параметрами.
но есть одно но...
нужно будет много одинаковых параметров.
каждое число к замене это отдельный параметр.

Код:
adoquery.SQL.text:='SELECT t1.*, t2.*,  t3.*, t4.*  
FROM ( ( [Лист1$] as t1 
         left join [Лист1$] as t2 on t1.[#] +:st1 =t2.[#]
       ) left join [Лист1$] as t3 on t1.[#] +:st2 =t3.[#]
     )   left join [Лист1$] as t4 on t1.[#] +:st3 =t4.[#]

where t1.[#] between 1 and :st4';
Код:
adoquery1.Parameterbyname('st1').value:=15000 *1;
adoquery1.Parameterbyname('st2').value:=15000 *2;
adoquery1.Parameterbyname('st3').value:=15000* 3;
adoquery1.Parameterbyname('st4').value:=15000;
хотя если немножко покумекать с вложенными запросами то может быть...
и удастся обойтись ровно одним параметром.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 26.03.2021, 11:04   #22
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,250
По умолчанию

а может и вовсе без них
Код:
select t1.*, t2.*, t3.*, t4.*
from ( ( ( t as t1 inner join ( select count(*)/4 as q from t ) as q on q.q =q.q
         ) left join t as t2 on t2.n =t1.n +q.q *1
       ) left join t as t3 on t3.n =t1.n +q.q *2
     ) left join t as t4 on t4.n =t1.n +q.q *3

where t1.n <=q.q
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 26.03.2021, 13:35   #23
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Я сделал так
Код:

row:=ADOQuery2.RecordCount div 4;

ADOQuery1.SQL.Add('SELECT t1.*, t2.*,  t3.*, t4.* FROM ( ( [Лист1$] as t1' + char(10) +
           'LEFT JOIN [Лист1$] as t2 on t1.NUM + s =t2.NUM)' + char(10) +
           'LEFT JOIN [Лист1$] as t3 on t1.NUM +(s*2) =t3.NUM)' + char(10) +
           'LEFT JOIN [Лист1$] as t4 on t1.NUM +(s*3) =t4.NUM' + char(10) +
           'WHERE t1.NUM BETWEEN 1 and s');

ADOQuery1.Parameters.ParamByName('s').Value := row;
Все работает отлично, даже если количество строк меняется в файле.
Serega_SS вне форума Ответить с цитированием
Старый 26.03.2021, 13:55   #24
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а может и вовсе без них
Код:
select t1.*, t2.*, t3.*, t4.*
from ( ( ( t as t1 inner join ( select count(*)/4 as q from t ) as q on q.q =q.q
         ) left join t as t2 on t2.n =t1.n +q.q *1
       ) left join t as t3 on t3.n =t1.n +q.q *2
     ) left join t as t4 on t4.n =t1.n +q.q *3

where t1.n <=q.q
Тут немного непонятно.

t это [Лист1$]
t1.n это t1.NUM
а что тогда такое q и q.q
Serega_SS вне форума Ответить с цитированием
Старый 26.03.2021, 14:56   #25
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,250
По умолчанию

именование для ссылок (алиасы имен полей и представлений/запросов )
count(*)/4 as q -так будем называть вычисленное поле
( select ... ) as q -- так будем назвать набор

чтобы не путаться
q как набор
q как поле
можно дать разные имена
( select count(*) /4 as st from t ) as rec

q.q ==> rec.st
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 29.03.2021, 05:28   #26
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Вот так я написал
Код:
ADOQuery1.SQL.Add('select t1.*, t2.*, t3.*, t4.*' + char(10) +
    'from ( ( ( [Лист1$] as t1 inner join ( select count(*)/4 as st from [Лист1$] ) as rec on rec.st = rec.st)'  + char(10) +
        'left join [Лист1$] as t2 on t2.NUM =t1.NUM +rec.st )'  + char(10) +
      'left join [Лист1$] as t3 on t3.NUM =t1.NUM +rec.st *2)'  + char(10) +
     'left join [Лист1$] as t4 on t4.NUM =t1.NUM +rec.st *3 ' + char(10) +
    'where t1.NUM <=rec.st');
Выходит ошибка "Не поддерживается выражение объединения Join"
Может я что-то не так написал.
Serega_SS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 20000 рублей в месяц

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

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


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS