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