Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.239.195] |
|
Данный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
возможно ли делать запросы из виртульных (отображаемых, т. е. созданных командой SELECT) таблиц?
т. е. что-то типа того: SELECT * FROM (SELECT field_name1, field_name2 FROM table_name WHERE field_name3 <> NULL) WHERE feild_name1 > 5 я понимаю, что пример плохой, но всё же, возможно ли это? |
Сообщ.
#2
,
|
|
|
Да
|
Сообщ.
#3
,
|
|
|
И не только select но и insert
|
Сообщ.
#4
,
|
|
|
а можно создать имя для виртуальной таблицы...и работать с ней как с обычной?
типа вот этого: create table virtual_table_name ( SELECT field_name3, field_name4 FROM table_name WHERE field_name1 < field_name2 ); UPDATE virtual_table_name SET field_name5 = field_name6 WHERE field_name7 <= ( SELECT count (field_name3) FROM virtual_table_name <-----------------------------here WHERE field_name3 = field_name4 ); drop table virtual_table_name; |
Сообщ.
#5
,
|
|
|
Цитата не можно, а нужно.archimed7592, 9.06.04, 17:18 а можно создать имя для виртуальной таблицы...и работать с ней как с обычной? Цитата не будет работать, нужно писатьSELECT * FROM (SELECT field_name1, field_name2 FROM table_name WHERE field_name3 <> NULL) Цитата SELECT * FROM (SELECT field_name1, field_name2 FROM table_name WHERE field_name3 <> NULL) А(алиас) |
Сообщ.
#6
,
|
|
|
All как получить имя файла созданого оператором "select" (_Q?????)?
|
Сообщ.
#7
,
|
|
|
Цитата archimed7592, 9.06.04, 17:18 а можно создать имя для виртуальной таблицы...и работать с ней как с обычной? Для этого существуют представления (Views). 2 Bas: не понял... Какого файла, каким "select" (_Q?????)? ??! |
Сообщ.
#8
,
|
|
|
InterBase не поддерживает такую форму запроса.
|
Сообщ.
#9
,
|
|
|
Цитата Chow @ 10.06.04, 09:14 Цитата archimed7592, 9.06.04, 17:18 а можно создать имя для виртуальной таблицы...и работать с ней как с обычной? Для этого существуют представления (Views). А я смогу в этот Views добавлять/изменять данные перед отправкой клиенту? И еще: если прав, то views это виртуальные(не физические) таблицы, а следовательно они сами будут уничножаться после окончания выполнения процедуры. Или надо самому чистить? |
Сообщ.
#10
,
|
|
|
View-представление, физически существует в виде уже скомпиленного запроса например[sql]select *
from таблица[/sql] и при вызове дает данные. вот и все Добавлено в : Цитата добавить нет, но изменить для показа да.[sql]select Name + ' user' AS NameDVP, 14.07.04, 09:08 А я смогу в этот Views добавлять/изменять данные перед отправкой клиенту? from таблица [/sql] правда существуют модифицируемые представления, но ета другая песня. |
Сообщ.
#11
,
|
|
|
Цитата DVP от 14.07.04, 06:08 они сами будут уничножаться после окончания выполнения процедуры. Или надо самому чистить? чистить вот так: if Active then Close; with SQL do begin Clear; Add('DROP VIEW Temper2, Temper3'); end; ExecSQL; |
Сообщ.
#12
,
|
|
|
А как проверить, что представления (view) существуеют в базе?
столкнулся с проблемой, что перед выполнением запросов необходимо прежде удалить представления, но не знаю проверить их наличие.... |
Сообщ.
#13
,
|
|
|
Разговор беспредметный... Вложенные запросы реализованы не во всех базах данных. Пожалуйста конкретезируйте с какой базой данных работаете...
|
Сообщ.
#14
,
|
|
|
сорри, даже и не знал, что по разному, думал, если пользоваться стандарт sql-92, то должно быть везде одинаково
конкретизирую ADO/Delphi6/Access97-2000-2002 |
Сообщ.
#15
,
|
|
|
Цитата tomsksmile, 5.10.04, 21:47 столкнулся с проблемой, что перед выполнением запросов необходимо прежде удалить представления, но не знаю проверить их наличие.... Удаляй... система сама разберётся есть оно или нет... |
Сообщ.
#16
,
|
|
|
2Vit,
Цитата т.е. предварительной проверки не нужно? сейчас я удалаю после выполнения необходимых операций. но при сбоях (во время отладки программы) создается часть представления, а посторно они не хотят создаваться... Удаляй... |
Сообщ.
#17
,
|
|
|
Удаляй! С MS Access наверное о наличие View можно судить только через OLE - проще удалить, чем обнаружить... В серверных базах данных это легче, там можно прокверить системные таблицы...
|
Сообщ.
#18
,
|
|
|
пробую
q.sql.Clear; q.SQL.Add('DROP VIEW Temper2, Temper3'); q.ExecSQL; //выполнение запроса пишет, что не удается найти таблицу или индекс. какие есть варианты? смотреть сстемные таблицы и искать в них представления? про ole ничего не слышал, это как? |
Сообщ.
#19
,
|
|
|
исползуи try finaly
если представление будет на месте - удолит, если нет - продолжит работу. |
Сообщ.
#20
,
|
|
|
попробывал ошибка не пропала
Цитата try q.sql.Clear; q.SQL.Add('DROP VIEW Temper2, Temper3'); q.open; // q.ExecSQL; finally end; |
Сообщ.
#21
,
|
|
|
в среде делфи ошибка всеравно будет вывалыватся, запусти егзешник вне делфи.
|
Сообщ.
#22
,
|
|
|
пробывал вот так и среде и без нее
try q.Connection := ModuleModel.ConModel; try q.sql.Clear; q.SQL.Add('DROP VIEW Temper2, Temper3'); q.open; except raise;// EOleException end; //.... finally q.Free; end; в среде вижу, что при ошибке вываливается программа на q.Free; |
Сообщ.
#23
,
|
|
|
Цитата tomsksmile, 7.10.04, 10:23 кажется ето то что тебе нужно, или я ошибаюс? в среде вижу, что при ошибке вываливается программа на q.Free; |
Сообщ.
#24
,
|
|
|
не нужно, чтобы проделавался код, который в моем примере скрывается за
Цитата //.... , а у меня он пропускается |
Сообщ.
#25
,
|
|
|
так перенеси его в раздел finally, веть етот раздел выполняется в лубом случае, не зависимо от того будет исклучение или нет.
или опять не понял? Добавлено Сегодня, 11:13 стоп. а разве так не достаточно? try q.Connection := ModuleModel.ConModel; try q.sql.Clear; q.SQL.Add('DROP VIEW Temper2, Temper3'); q.open; finally raise;// EOleException //.... end; finally q.Free; end; |
Сообщ.
#26
,
|
|
|
Цитата Kobra, 7.10.04, 11:08 q.open; q.ExecSQL |
Сообщ.
#27
,
|
|
|
а я скопировал и даже не прочитал
|
Сообщ.
#28
,
|
|
|
вот моя процедура
procedure TFormGraphBuild.TemperSQL(Sender: TObject; num : integer); var str : string; begin q := TADOQuery.Create(form1); try q.Connection := ModuleModel.ConModel; try q.sql.Clear; q.SQL.Add('DROP VIEW Temper2, Temper3'); q.ExecSQL; finally; sqlString := 'CREATE VIEW Temper2 AS '+ 'SELECT model.id, modelparametr.parametr, modelparametr.value '+ 'FROM model LEFT JOIN modelparametr ON model.id = modelparametr.id '+ 'WHERE modelparametr.parametr=%s'; sqlString := format(sqlString, ['"temp"']); q.SQL.Add(sqlString); q.ExecSQL; //<---------------------------- q.sql.Clear; // .......................... q.sql.Clear; q.SQL.Add('DROP VIEW Temper2, Temper3'); q.ExecSQL; end; finally q.Free; end; end; реально, на момент запуска процедуры, в базе есть только представление Temper3. Соответственно на строке q.SQL.Add('DROP VIEW Temper2, Temper3'); возникает ошибка, перехожу в раздел finally, но при выполение запроса q.ExecSQL выскакивает Ощибка синтаксиса в инструкуии DROP Table или DROP Index. может нужно по отдельности пробывать удалять? |
Сообщ.
#29
,
|
|
|
Цитата tomsksmile, 7.10.04, 11:48 может нужно по отдельности пробывать удалять? естественно |
Сообщ.
#30
,
|
|
|
Классика - Drop index <имя таблицы>.<имя индекса> Jet Accessa - DROP {TABLE таблица | INDEX индекс ON таблица | PROCEDURE процедура | VIEW представление} И нигде нет перечисления (,) |
Сообщ.
#31
,
|
|
|
у меня в конце процедуры есть перечисление и все удалается нормально.... сейчас попробую
ниче не понимаю - в одном месте работает перечисление (после того как созданы представления - я их удаляю одним запросом), а просто удалить не могу (если одного или двух представлений нет) - вылетает ошибка... |
Сообщ.
#32
,
|
|
|
А возможно при старте программы создать виртуальную БД, к которой возможно будет делать SQL запросы и которая будет существовать только на время работы программы без создания физических файлов на диске?
|
Сообщ.
#33
,
|
|
|
Да.
|
Сообщ.
#34
,
|
|
|
MIF и даже в tempdb ничего не будет физически записано на диск?
|
Сообщ.
#35
,
|
|
|
Цитата Павел Калугин @ MIF и даже в tempdb ничего не будет физически записано на диск? List of in-memory databases А вот "гарантию - только в памяти" слету сложно дать, нужно смареть реализации. Очень похоже, что SQLite этим может похвастаться: "SQL database that supports in-memory storage with the :memory: connection string" |