Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли сделать запрос SQL из данных фиктивной таблицы?


Страницы:   1 2

gedevan ©   (2016-01-29 08:45:00) 

Есть таблицы из которых я получаю данные, и есть список полей по которым я хотел бы эту выборку ограничить.  Ограничение должно выполняться по 2м полям. Список этот может быть оооочень длинным. И когда я попытался добавить все это условие в раздел where, то Access ругнулся на то что запрос слишком сложный. Тогда я решил сделать из этого списка таблицу и сделать запрос по обеим таблицам с условием равенства значений в колонках (или joinуть таблицы, и выкинуть строки в которых NULL получилось). Но делать ради этого реальную таблицу и сохранять ее в бд мне совсем не хочется. Можно ли обойтись без этого?

Вот что изобрел я, но он ругается на то, что в качестве входных данных должна быть таблица или запрос, а где взять эту таблицу для моего фиктивного подзапроса я не знать, можно ли так вообще делать?.

'Select

''Tem'',ShotNumber,Name,ItemName,NumberOfSearch,tempfound,itIsTemplate, anotherTime, SearchFixed, x1,x2,y1,y2,ksov,searchtime,FourSearch,NULL,errorCode

FROM

Templates,

 (  SELECT ''Overview'' as Name1,'''' as ItemName1  UNION  SELECT ''Overview'' as Name1,''TL'' as ItemName1  ) as distTab

 where ShotNumber = :prm0 and (Templates.Name = distTab.Name1)

//далее прочие запросы, в них нет попытки фильтра

UNION Select ''Col'',ShotNumber, Name,''no items'',0,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,searchtime,''fal se'',NULL,errorCode FROM ColorSearch where ShotNumber = :prm2 UNION Select ''Dyn'',ShotNumber, Name,''no items'',NumberOfSegment,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,se archtime,''false'',NULL,errorCode FROM DynObj where ShotNumber = :prm1 UNION Select ''Tex'',ShotNumber, Name,''no items'',NumberOfSegment,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,se archtime,''false'',RecognizedText,errorCode FROM TextRecognize where ShotNumber = :prm3;'


кгшзх   (2016-02-05 12:10:00) [1]

CREATE TABLE distTab (Name1 char(50), ItemName1 char(50));

варчар-то куда делся?


gedevan   (2016-02-05 12:03:00) [2]

Посмотрел, оказывается дело в том что скюль выдает Name удлиняя его пробелами до максимально возможной длины поля таблицы, и в результате в складируемое поле оно так и попадает с пробелами, а дбГрид видимо  так все это показывает что видно только пробелы ) , добавил rtrim и заработало


кгшзх   (2016-02-05 08:47:00) [3]

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


gedevan   (2016-02-04 23:37:00) [4]

но тогда почему я вижу no items? ведь если Name есть null значит Name + 'no items' тоже должно быть null.

Да и почему оно null то? ведь поле Name в dbGrid у меня нормально отображается. и есть поля где и Name и ItemName вроде как не null, но в них поле FiltrField также пустое.


кгшзх   (2016-02-04 19:37:00) [5]

null + somethingevennotnull = null


gedevan   (2016-02-04 19:16:00) [6]

Попробовал так, но видимо что то я опять неправильно попробовал.


Function GetPhotoQueryText(AConnection: TADOConnection; var parQty: integer;
 cond: string): string;
begin
 result := '';
 parQty := 0;

 if TableExists(AConnection, 'Templates') then
 begin
   result := result +

     ' Select ' + '''Tem'' as objType,' + 'ShotNumber,' + 'Name,' + 'ItemName,' +
     'NumberOfSearch,' + 'tempfound,' + 'itIsTemplate, ' + 'anotherTime, ' +
     'SearchFixed, ' + 'x1,' + 'x2,' + 'y1,' + 'y2,' + 'ksov,' + 'searchtime,'
     + 'FourSearch,' + 'NULL as RecognizedText,' + 'errorCode, Name+ItemName AS FiltrField ' +
     'FROM Templates '+
     ' where ShotNumber = :prm0 ';
   inc(parQty);
 end;

 if TableExists(AConnection, 'ColorSearch') then
 begin
   if result <> '' then
     result := result + ' UNION ';

   result := result + 'Select ''Col'' as objType,ShotNumber, ' +
     'Name,''no items'' as ItemName,0,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,searchtime,'
     + '''false'',NULL  as RecognizedText,errorCode, Name+''no items'' AS FiltrField ' +
     ' FROM ColorSearch ' +
     'where ShotNumber = :prm2';
   inc(parQty);
 end;

 if TableExists(AConnection, 'DynObj') then
 begin
   if result <> '' then
     result := result + ' UNION ';

   result := result + 'Select ' + '''Dyn'' as objType,' + 'ShotNumber, ' + 'Name,' +
     '''no items'' as ItemName,' + 'NumberOfSegment,' + 'tempfound,' +
     '''false'',' + '''false'',' + '''false'',' + 'x1,' + 'x2,' + 'y1,' + 'y2,'
     + '0,' + 'searchtime,' + '''false'',' + 'NULL  as RecognizedText,' +
      'errorCode , Name+''no items'' AS FiltrField ' +
     ' FROM DynObj where ShotNumber = :prm1';
   inc(parQty);
 end;

 if TableExists(AConnection, 'TextRecognize') then
 begin
   if result <> '' then
     result := result + ' UNION ';

   result := result + 'Select ''Tex'' as objType,ShotNumber, ' +
     'Name,''no items'' as ItemName,NumberOfSegment,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,s earchtime,'
     + '''false'',RecognizedText,errorCode, Name+''no items'' AS FiltrField ' +
     ' FROM TextRecognize ' +
     ' where ShotNumber = :prm3';
   inc(parQty);
 end;

 if result <> '' then
 begin
   result := 'select objType,ShotNumber,Name,ItemName,NumberOfSearch,tempfound,'
           + 'itIsTemplate, anotherTime, SearchFixed,x1,x2,y1,y2,ksov,searchtime,'
           + 'FourSearch,RecognizedText,errorCode,FiltrField,Name+ItemName AS FiltrField2 from (' + result + ')';
   if cond <> '' then
     result := result +
            '  where FiltrField IN ' + cond;
 end;

 if result <> '' then
   result := result + ';';
end;


Проблема в том, что в DBGrid в полях FiltrField и FiltrField2  я вижу только no items, т.е. те которые были добавлены в виде строки, а вот следов Name или ItemName я там не вижу ( т.е. поле просто пустое. Почему?


sniknik   (2016-01-30 00:42:00) [7]

> или начать решать задачу а метод решения этой задачи...
или начать решать задачу а НЕметод решения этой задачи...


sniknik   (2016-01-30 00:40:00) [8]

> Я реализовал как написано в [1] только все отдельными командами.
в [1] ничего о реализации не написано.

> Можно было бы хотя бы намекнуть что именно гуглить.
нет волшебных слов/команд, нечего гуглить... все в деталях. как именно ты делаешь и зачем... например можно на 100% сократить время какого то действия, если понять что оно нужно и избавится от него. или начать решать задачу а метод решения этой задачи...

> И перед просмотром я хочу выбирать определенные типы
и в чем же проблема? зачем тебе для этого таблица или запрос из "не таблицы"?
вот это вот для этого?
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');

чтобы после по ней выбрать?
возьми уникальное значение отсюда (если его нет то сделай, добавь фиктивное/искусственный ключ) и выбирай по нему, о списку из значений который будешь набирать галочками... так, например
SELECT ... FROM SomeTable WHERE SomeField IN ('FT2', 'Y', 'Y3')
все, если в списке идентификаторы(типы) шаблонов, и в поле тоже значение идентификатор шаблона получишь -
> чтобы мне в выборку попадали только шаблоны заданных типов.
задача решена.


gedevan   (2016-01-29 19:21:00) [9]

У меня есть база в которой хранятся шаблоны разных типов. И перед просмотром я хочу выбирать определенные типы (это вот те которых 415) и хочу чтобы мне в выборку попадали только шаблоны заданных типов. Т.е. я не могу 1 раз и навсегда настроить фильтр и сохранить его в базе. Это делается перед формированием отчета. В дереве с галочками я выбираю нужные шаблоны. И вот если поставить все возможные галки то ждать будешь 5-10 секунд пока на каждую галку добавится строка в таблицу. Я реализовал как написано в [1] только все отдельными командами. Таблицу создаю заранее. А после изменения состояния галок делаю только команды Insert в цикле, т.к. одной строкой как это написано в [1]  аксес не делает.

А сам запрос (из стартового поста) работает после этого быстро, к нему нет претензий.

Как заполнить таблицу быстрее и причем тут индексы я понятия не имею ( Очевидно, если бы я ничего не читал, то я и того что написал не сделал бы. Можно было бы хотя бы намекнуть что именно гуглить.


sniknik   (2016-01-29 17:15:00) [10]

> При добавлении нескольких десятков записей процесс длится...достаточно чтобы успеть подумать что нибудь нехорошее про скорость работы программы.
подумай лучше про реализацию (твои кривые руки)... access локально, и на небольших объемах (до 1.5гига база) быстрее чем mssql. не все конечно, но ... (чисто серверные обработки). а вот использование готовых индексов на клиенте прямо из базы, наоборот, ни один из sql серверов не умеет.


кгшзх   (2016-01-29 16:48:00) [11]

Можно ли сделать запрос SQL из данных фиктивной таблицы?

Можно.


gedevan   (2016-01-29 16:33:00) [12]


> а вообще тебе сюда наверное


как и тебе


gedevan   (2016-01-29 16:30:00) [13]

несколько десятков это 415 :-D


кгшзх   (2016-01-29 16:26:00) [14]

азят только поля. таблицы не азят.

.... SELECT ''Overview'' as Name1,''TL'' as ItemName1) as distTab

а вообще тебе сюда наверное
http://www.melange-m.ru/articles/4


gedevan   (2016-01-29 16:23:00) [15]

но я все равно не вижу, чем то что я накалякал отличается от этого (


Select ''Tem'',ShotNumber, Name, ItemName,NumberOfSearch, tempfound, itIsTemplate, anotherTime, SearchFixed, x1,x2,y1,y2,ksov,searchtime,FourSearch, NULL, errorCode
     FROM Templates,(SELECT ''Overview'' as Name1,NULL as ItemName1  UNION  SELECT ''Overview'' as Name1,''TL'' as ItemName1) as distTab
      where (Templates.Name = distTab.Name1) and ShotNumber = :prm0;


такой запрос дает сообщение:

В качестве входных данных запрос должен иметь хотя бы одну таблицу или запрос.

У добавления командами в реальную таблицу записей выявился тоже неприятный недостаток. При добавлении нескольких десятков записей процесс длится...достаточно чтобы успеть подумать что нибудь нехорошее про скорость работы программы. А добавлять одной командой сразу все записи Акссес отказывается ( т.е. вот такой номер

INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');


не прокатывает, ругается на всякие синтаксические ошибки.


кгшзх   (2016-01-29 13:10:00) [16]

....
Templates,
( SELECT ''Overview'' as Name1,null as ItemName1  
  UNION  
  SELECT ''Overview'' as Name1,''TL'' as ItemName1
) FICTIONTABLE

where
templates.something = FICTIONTABLE.name1


кгшзх   (2016-01-29 12:44:00) [17]

но именно это я и пробовал делать

пробовал именно это, а накалякал не это


gedevan   (2016-01-29 12:06:00) [18]


> запрос есть, таблицы нет.


но именно это я и пробовал делать в 1м посте, но он требует указать таблицу.

Поэтому я перешел таки к варианту создания таблицы (


sniknik   (2016-01-29 11:58:00) [19]

> запрос есть, таблицы нет.
а вот так уже не получится

select 'value' as field1, 666 as field2
union
select 'value' as field1, 666 as field2

а он похоже на этой "сверхидее" логику строит... лучше бы стандарты сначала освоил. и логику обычную.


кгшзх   (2016-01-29 11:54:00) [20]

Можно ли сделать запрос SQL из данных фиктивной таблицы

можно

select 'value' as field1, 666 as field2

запрос есть, таблицы нет.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо