![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли сделать запрос SQL из данных фиктивной таблицы?
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
запрос есть, таблицы нет.