На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
  
> запросы из виртуальных таблиц... , Delphi/ADO/SQL
    возможно ли делать запросы из виртульных (отображаемых, т. е. созданных командой SELECT) таблиц?
    т. е. что-то типа того:
    ExpandedWrap disabled
      SELECT *
      FROM (SELECT field_name1, field_name2
            FROM table_name
            WHERE field_name3 <> NULL)
      WHERE feild_name1 > 5

    я понимаю, что пример плохой, но всё же, возможно ли это?
      Да
        И не только select но и insert
          а можно создать имя для виртуальной таблицы...и работать с ней как с обычной?
          типа вот этого:
          ExpandedWrap disabled
             
            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;
            Цитата
            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) А(алиас)
              All как получить имя файла созданого оператором "select" (_Q?????)?
                Цитата
                archimed7592, 9.06.04, 17:18
                а можно создать имя для виртуальной таблицы...и работать с ней как с обычной?

                Для этого существуют представления (Views).

                2 Bas: не понял... :wacko: Какого файла, каким "select" (_Q?????)? ??!
                  InterBase не поддерживает такую форму запроса. :wacko:
                    Цитата Chow @ 10.06.04, 09:14
                    Цитата
                    archimed7592, 9.06.04, 17:18
                    а можно создать имя для виртуальной таблицы...и работать с ней как с обычной?

                    Для этого существуют представления (Views).

                    А я смогу в этот Views добавлять/изменять данные перед отправкой клиенту?

                    И еще: если прав, то views это виртуальные(не физические) таблицы, а следовательно они сами будут уничножаться после окончания выполнения процедуры. Или надо самому чистить?
                      View-представление, физически существует в виде уже скомпиленного запроса например[sql]select *
                      from таблица[/sql] и при вызове дает данные. вот и все

                      Добавлено в :
                      Цитата
                      DVP, 14.07.04, 09:08
                      А я смогу в этот Views добавлять/изменять данные перед отправкой клиенту?
                      добавить нет, но изменить для показа да.[sql]select Name + ' user' AS Name
                      from таблица [/sql]
                      правда существуют модифицируемые представления, но ета другая песня.
                        Цитата
                        DVP от 14.07.04, 06:08
                        они сами будут уничножаться после окончания выполнения процедуры. Или надо самому чистить?

                        чистить вот так:

                        ExpandedWrap disabled
                          if Active then Close;
                          with SQL do
                          begin
                                     Clear;
                                     Add('DROP VIEW Temper2, Temper3');
                          end;
                          ExecSQL;
                          А как проверить, что представления (view) существуеют в базе?

                          столкнулся с проблемой, что перед выполнением запросов необходимо прежде удалить представления, но не знаю проверить их наличие....
                            Разговор беспредметный... Вложенные запросы реализованы не во всех базах данных. Пожалуйста конкретезируйте с какой базой данных работаете...
                              сорри, даже и не знал, что по разному, думал, если пользоваться стандарт sql-92, то должно быть везде одинаково
                              конкретизирую
                              ADO/Delphi6/Access97-2000-2002
                                Цитата tomsksmile, 5.10.04, 21:47
                                столкнулся с проблемой, что перед выполнением запросов необходимо прежде удалить представления, но не знаю проверить их наличие....



                                Удаляй... система сама разберётся есть оно или нет...
                                  2Vit,
                                  Цитата
                                  Удаляй...
                                  т.е. предварительной проверки не нужно? сейчас я удалаю после выполнения необходимых операций. но при сбоях (во время отладки программы) создается часть представления, а посторно они не хотят создаваться...
                                    Удаляй! С MS Access наверное о наличие View можно судить только через OLE - проще удалить, чем обнаружить... В серверных базах данных это легче, там можно прокверить системные таблицы...
                                      пробую
                                      ExpandedWrap disabled
                                         
                                            q.sql.Clear;
                                            q.SQL.Add('DROP VIEW Temper2, Temper3');
                                            q.ExecSQL; //выполнение запроса

                                      пишет, что не удается найти таблицу или индекс. какие есть варианты? смотреть сстемные таблицы и искать в них представления? про ole ничего не слышал, это как?
                                        исползуи try finaly
                                        если представление будет на месте - удолит, если нет - продолжит работу.
                                          попробывал ошибка не пропала
                                          Цитата


                                          try
                                          q.sql.Clear;
                                          q.SQL.Add('DROP VIEW Temper2, Temper3');
                                          q.open; // q.ExecSQL;
                                          finally

                                          end;
                                            в среде делфи ошибка всеравно будет вывалыватся, запусти егзешник вне делфи.
                                              пробывал вот так и среде и без нее
                                              ExpandedWrap disabled
                                                 
                                                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;
                                                Цитата tomsksmile, 7.10.04, 10:23
                                                в среде вижу, что при ошибке вываливается программа на q.Free;
                                                кажется ето то что тебе нужно, или я ошибаюс?
                                                  не нужно, чтобы проделавался код, который в моем примере скрывается за
                                                  Цитата
                                                  //....

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

                                                    Добавлено Сегодня, 11:13
                                                    стоп. а разве так не достаточно?
                                                    ExpandedWrap disabled
                                                      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;
                                                    Сообщение отредактировано: Kobra -
                                                      Цитата Kobra, 7.10.04, 11:08
                                                      q.open;

                                                      q.ExecSQL
                                                        а я скопировал и даже не прочитал :D
                                                          вот моя процедура
                                                          ExpandedWrap disabled
                                                             
                                                            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. Соответственно на строке
                                                          ExpandedWrap disabled
                                                            q.SQL.Add('DROP VIEW Temper2, Temper3');

                                                          возникает ошибка, перехожу в раздел finally, но при выполение запроса q.ExecSQL выскакивает Ощибка синтаксиса в инструкуии DROP Table или DROP Index. может нужно по отдельности пробывать удалять?
                                                            Цитата tomsksmile, 7.10.04, 11:48
                                                            может нужно по отдельности пробывать удалять?

                                                            естественно
                                                              ExpandedWrap disabled
                                                                 
                                                                Классика - Drop index <имя таблицы>.<имя индекса>
                                                                Jet Accessa -
                                                                DROP {TABLE таблица | INDEX индекс ON таблица | PROCEDURE процедура | VIEW представление}

                                                              И нигде нет перечисления (,)
                                                                у меня в конце процедуры есть перечисление и все удалается нормально.... сейчас попробую

                                                                ниче не понимаю - в одном месте работает перечисление (после того как созданы представления - я их удаляю одним запросом), а просто удалить не могу (если одного или двух представлений нет) - вылетает ошибка...
                                                                Сообщение отредактировано: tomsksmile -
                                                                  А возможно при старте программы создать виртуальную БД, к которой возможно будет делать SQL запросы и которая будет существовать только на время работы программы без создания физических файлов на диске?
                                                                    Да.
                                                                      MIF и даже в tempdb ничего не будет физически записано на диск?
                                                                        Цитата Павел Калугин @
                                                                        MIF и даже в tempdb ничего не будет физически записано на диск?


                                                                        List of in-memory databases

                                                                        А вот "гарантию - только в памяти" слету сложно дать, нужно смареть реализации.

                                                                        Очень похоже, что SQLite этим может похвастаться:
                                                                        "SQL database that supports in-memory storage with the :memory: connection string"
                                                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                        0 пользователей:


                                                                        Рейтинг@Mail.ru
                                                                        [ Script execution time: 0,0622 ]   [ 15 queries used ]   [ Generated: 3.05.24, 09:29 GMT ]