Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2018.01.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
gedevan   (2016-01-29 08:45) [0]

Есть таблицы из которых я получаю данные, и есть список полей по которым я хотел бы эту выборку ограничить.  Ограничение должно выполняться по 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;"


 
gedevan   (2016-01-29 10:21) [1]


CREATE TABLE distTab (Name1 char(50), ItemName1 char(50));
insert into distTab VALUES  (""Undocking"", """" ),(""Undocking"", ""DefaultItem"" );
Select ""Tem"",ShotNumber,Name,ItemName,NumberOfSearch,tempfound,itIsTemplate, anotherTime, SearchFixed, x1,x2,y1,y2,ksov,searchtime,FourSearch,NULL,errorCode FROM Templates  where ShotNumber = :prm0 and (Templates.Name = distTab.Name1)  and (Templates.ItemName = distTab.ItemName1);


ничего не могу понять ( говорит синтаксическая ошибка в выражении CREATE TABLE, какая?!!! я ничего не вижу (


 
кгшзх ©   (2016-01-29 10:34) [2]

select "value" as field1,
        666 as field2


 
sniknik ©   (2016-01-29 11:01) [3]

аксесс не умеет выполнять пакеты, только команды.


 
gedevan   (2016-01-29 11:44) [4]

хм...более того он создает в базе таблицу....т.е. без этого никак? придется в любом случае создавать?


 
gedevan   (2016-01-29 11:45) [5]


> select "value" as field1,
>          666 as field2


я не понял мысль.


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

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

можно

select "value" as field1, 666 as field2

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


 
sniknik ©   (2016-01-29 11:58) [7]

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

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

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


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


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


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

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


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

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

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


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

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

where
templates.something = FICTIONTABLE.name1


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

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


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 16:26) [12]

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

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

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


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

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


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


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


как и тебе


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

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

Можно.


 
sniknik ©   (2016-01-29 17:15) [16]

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


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

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

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

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


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

> Я реализовал как написано в [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")
все, если в списке идентификаторы(типы) шаблонов, и в поле тоже значение идентификатор шаблона получишь -
> чтобы мне в выборку попадали только шаблоны заданных типов.
задача решена.


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

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


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

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


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 я там не вижу ( т.е. поле просто пустое. Почему?


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

null + somethingevennotnull = null


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

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

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


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

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


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

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


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

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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2018.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.002 c
2-1454867320
JohnKorsh
2016-02-07 20:48
2018.01.14
Как открыть файл только для чтения.


2-1454258706
ramstain
2016-01-31 19:45
2018.01.14
type record


2-1454046359
gedevan
2016-01-29 08:45
2018.01.14
Можно ли сделать запрос SQL из данных фиктивной таблицы?


1-1355981373
oren_yastreb
2012-12-20 09:29
2018.01.14
User Unit 5; вызывает ошибку


2-1454488797
KostaRik
2016-02-03 11:39
2018.01.14
Динамические массивы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский