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

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

Как сделать sql запрос к нескольким таблицам (ADO,MS Access)?


Страницы:   1 2 3

gedevan ©   (2016-01-08 14:52:00) 

есть несколько таблиц которые на выходе запроса я хочу превратить в одну. Причем в интернете описывается как одну таблицу присоединить к другой (т.е. делается соединение приклеиванием справа колонок другой таблицы). Мне же нужно, чтобы мои таблицы в результирующей выборки шли одна за другой. Причем в таблицах есть как одинаковые колонки, так и уникальные для каждой таблицы. Т.е. как сделать чтобы в итоговой выборке совпадающие по имени колонки совместились (по вертикали), а несовпадающие также присутствовали в итоговой выборке, но в тех частях данных которые соответствуют таблицам где такой колонки нет, там просто были бы пустые значения. И еще как прикрутить к этой таблице колонку "Имя таблицы" и записать в него имя таблицы из которой собственно эти данные в выборку и попали?

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


sniknik   (2016-01-28 10:38:00) [21]

> А просто No нет.
а у тебя реально access?

Boolean data type
A True/False or yes/no value. Boolean values are usually stored in Bit fields in a Microsoft Jet database; however, some databases don't support this data type directly.


> если значение поля в запросе равно единице то вернуть вместо единицы тру?
somefield * -1
если, как я понял, у тебя там "извращенное значение типа" - 0 = false, 1 = true.

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


кгшзх   (2016-01-28 08:57:00) [22]

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


Кщд   (2016-01-28 06:51:00) [23]

iif/switch
в гугле забанили?


gedevan   (2016-01-27 19:34:00) [24]

прочитал мануал по sql но так и не нашел. Неужели нет возможности вставить конструкцию типа if value = 1 then ''true'' ну то есть, если значение поля в запросе равно единице то вернуть вместо единицы тру?


gedevan   (2016-01-27 19:11:00) [25]

ADOQuery.Fields[16].FieldName


gedevan   (2016-01-27 18:53:00) [26]

да, но она преобразование проходит. А просто No нет.

И еще вопрос как в TADODataset узнать имя поля в выборке? ибо DBGrid требует указывать имя поля, которого я не знаю ( т.к. там что то вроде Expr1000


sniknik   (2016-01-27 18:51:00) [27]

> Я хочу чтобы так все поля показывали (
вычисляемые поля не имеют заголовка с типом, тип определяется в вариантном значении, а оно в зависимости от выражения (движком)...
еще вот попробуй длинну строки  в поле получить определенную, ну вот ты знаешь что результирующая строка длинной не больше 10 символов, а выражение даже сложение пустых - ''+'' даст строку пустую конечно же но в поле длинной 255... вроде бы, не помню. проверь.


sniknik   (2016-01-27 18:33:00) [28]

> Поставил NO
вообще то ты поставил строку 'No', а не No ...


gedevan   (2016-01-27 17:25:00) [29]

и ''false'' и ''no'' функцией преобразуется без ошибок. А DBGrid данные из таблицы Template показывает как 0 и -1 ( при этом.


gedevan   (2016-01-27 15:12:00) [30]


AConnection.Execute('CREATE TABLE ColorSearch ' +
     '(_Index int IDENTITY(1,1),'+
     'ShotNumber numeric(19,0),' +
     'Name char(50),' +
     'NumberOfSegment  numeric(10,0),'+
     'tempfound bit NULL DEFAULT 0, ' +
     'x1 numeric(10,0),' +
     'x2 numeric(10,0),' +
     'y1 numeric(10,0),' +
     'y2 numeric(10,0),' +
     'searchtime numeric(10,0),' +
     'NameConnectedScreen char(50),' +
     ' errorCode numeric(19,0)'
      + ');');


вот так выглядит реальная таблица ColorSearch.


gedevan   (2016-01-27 15:08:00) [31]


if TableExists(AConnection, 'Templates') then
 begin
   result := result +
   'Select ' +
   '''Tem'','+
   'ShotNumber,' +
   'Name,' +
   'ItemName,' +
   'NumberOfSearch,' +
   'tempfound,'+
   'itIsTemplate,' +
   'anotherTime,' +
   'SearchFixed,' +
   'x1,' +
   'x2,' +
   'y1,' +
   'y2,' +
   'ksov,' +
   'searchtime,' +
   'FourSearch,' +
   'NameConnectedScreen,' +
   'NULL,' +
   'errorCode ' +
   'FROM Templates  where ShotNumber = :prm0';
   inc(parQty);
 end;

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

   result := result + 'Select ''Col'',ShotNumber, ' +
     'Name,''no items'',NumberOfSegment,tempfound,''No'',''No'',''No'',x1,x2,y1,y2,0,searchtime, ' +
     '''No'',NameConnectedScreen,NULL,errorCode FROM ColorSearch where ShotNumber = :prm2';
   inc(parQty);
 end;


эм, сократил до 2х запросов, для теста. Поставил NO, теперь у меня в строках из темплейта 0  и -1 в dbgrid, а из таблицы ColorSearch показывает NO. А вот например поле tempfound, которое я добавил в ColorSearch и заполняю в таблице и для него для всех строк отражается true,false. Я хочу чтобы так все поля показывали (


sniknik   (2016-01-27 11:14:00) [32]

> В остальных я просто подставляю
подставляй No, если дело в том о чем пишешь, а не в 17й строке, поможет. хотя... насколько помню 0 прекрасно преобразуется в буленовский тип.


gedevan   (2016-01-27 11:01:00) [33]

Еще одна проблема с этим запросом

поле FourSearch, есть только в первом запросе. В остальных я просто подставляю 0, а в таблице по которой делается запрос вообще нет такой колонки. И вот когда я через TADODataSet пытаюсь бегать по этой выборке и вызывать FourSearch := ADODataSet.FieldByName('FourSearch').Asboolean;

То он ругается что не может преобразовать ее к типу булеан! даже если я вызываю эту команду только в отношении строк которые взяты из таблицы Templates. И если этот датасет вывести в DBGrid то в этом поле будет значится 0 или -1. А если открыть в екселе, то ЛОЖЬ или ИСТИНА!

Чтобы такое сделать чтобы в DBGrid отображалось True,False ну и не ругалось чтобы оно?

На данный момент я нашел только одно решение, добавить во все таблицы это поле и забивать его каким то одним значением. А можно ли это решить на уровне этого запроса не добавляя ничего в таблицы?


sniknik   (2016-01-24 18:10:00) [34]

> загружать все 600+ мб одним запросом что-то мне не нравится
не поверишь, но это и не рекомендуется. загружать нужно только то что требуется.

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

> но стоит узнавать, будет ли от этого толк?
научишься будет, нет значит нет.


gedevan   (2016-01-24 07:31:00) [35]

И все же при больших базах (1-2кк + записей) скорость выполнения запроса сильно падает. Вопрос если использовать paradox может стать быстрее? Или что нибудь еще? Вариант загружать все 600+ мб одним запросом что-то мне не нравится, да и сомневаюсь что по выборке он будет быстрее бегать...

Или может что то можно сделать с базой, чтобы запросы делались быстрее? Сейчас у меня несколько таблиц у них у всех есть одно поле по которому их можно связать, собственно это where ShotNumber = :prm';

Я ничего не индексирую не связываю, т.к. собственно и не знаю как, но стоит узнавать, будет ли от этого толк?


gedevan   (2016-01-18 03:03:00) [36]

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


sniknik   (2016-01-11 17:14:00) [37]

> Почему не сделать DECLARE переменная
Access

> И с какого перепуга "одним запросом быстрее получится"
при прочих равных, 1 запрос на 1000 записей, и 100 запросов по 10 записей... первый будет быстрее. ну и т.д. в пропорции.

> из-за UNION? о___О
из-за него как раз может притормозить, т.к. неявно distinct - сортировка делается, т.е. дополнительная обработка данных, т.что если этого не нужно лучше использовать UNION ALL.
хотя боюсь тормоза у него не из-за скорости выборки, а из-за его же собственного кода, как и здесь
http://delphimaster.ru/cgi-bin/forum.pl?id=1451827715&n=18
sniknik ©   (03.01.16 18:58) [6]


Лори   (2016-01-11 12:07:00) [38]

Несколько не мой подтип СУБД/Драйвер, но напишу мысли.

Почему не сделать DECLARE переменная, переменная равна параметру prm, в самом запросе использовать переменную?
Почему вообще не сделать просто VIEW в БД?

И с какого перепуга "одним запросом быстрее получится" из-за UNION? о___О
Это скорее индексы надо добавлять...


sniknik   (2016-01-09 18:26:00) [39]

реально это 4-ре параметра, алиасы/одноименные не поддерживаются (как было в BDE например, хотя там это было типа полу ошибкой). а почему... ну так сделали, и не в дельфе, а в "API" там вообще вопросиками и по порядковому номеру назначаются... в дельфе хоть какое то удобство.
если хочешь можешь оставить как есть, одноименными, но значение задавать все одно всем, по индексу. тоже можно.


gedevan   (2016-01-09 01:45:00) [40]

да сделал в запросе prm,prm2,prm3,prm4 и заработало. Хотя как по мне так это бред (я учился на 1С) ибо реально это один параметр, одно и тоже значение. почему его нужно разными то писать.


Страницы:   1 2 3

Наверх

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