Команда SELECT - SQL и другие команды SQL для данной версии Visual FoxPro 9.0 существенно улучшены и расширены. В данном Параграфе рассматриваются и обсуждаются как улучшенные так и новые функциональные особенности технологии SQL (в реализации Visual FoxPro).

Expand imageРасширенные Возможности

Некоторые ограничения команды SELECT - SQL теперь сняты, улучшены Технологические Характеристики SQL Visual FoxPro 9.0. В следующей Таблице перечислены снятые Ограничения или Улучшенные характеристики.

Возможность Краткое Описание

Количество Секций Join и Подзапросов в команде SELECT - SQL

В версии Visual FoxPro 9.0 снято общее ограничение по количеству секций JOIN и Подзапросов в одной команде SELECT - SQL. Предыдущее ограничение = 9 (девять).

Количество Секций UNION в команде SELECT - SQL 

В версии Visual FoxPro 9.0 снято ограничение по количеству секций UNION в одной команде SELECT - SQL. Предыдущее ограничение = 9 (девять).

Количество ссылок на Таблицы в одной команде SELECT - SQL 

В версии Visual FoxPro 9.0 снято ограничение по количеству ссылок на Таблицы в одной команде SELECT - SQL. Предыдущее ограничение = 30 (тридцать).

Количество Аргументов  в Секции IN( )

В версии Visual FoxPro 9.0 снято ограничение по количеству аргументов (<=24),  Значений в секции IN () из общего утверждения WHERE. Однако, количество рассматриваемых Значений может быть определено системной Функцией: SYS(3055) – FOR and WHERE Clause Complexity. Относительно Функциональных изменений секции IN, смотрите подраздел Изменения функциональности в Текущей (9) версии.

Expand imageРасширение функциональности использования ПодЗапросов SQL

В версии Visual FoxPro 9.0 обеспечена большая Гибкость при создании Подзапросов. Например, теперь поддерживаются несколько ПодЗапросов в одной команде SELECT-SQL. Далее описаны основные Улучшения функциональности ПодЗапросов.

Несколько ПодЗапросов

Visual FoxPro 9.0 поддерживает множественные вложенные ПодЗапросы, с поддержкой Корреляции элементов относительно Родительского Запроса. Теперь отсутствуют Ограничения по глубине вложенных Подзапросов. В версии Visual FoxPro 8.0, возникала Ошибка = 1842 (SQL: Подзапрос, недопустимое вложение), которая порждалась при использовании более Одного вложения ПодЗапросов в одной команде SQL.

Далее приводится Основная допустимая синтаксическая Конструкция для нескольких вложенных ПодЗапросов.

SELECT … WHERE … (SELECT … WHERE … (SELECT …) …) …

Пример:

Представленный далее Пример приводит к возникновению ошибочной ситуации в версии Visual FoxPro 8.0; Однако, в версии Visual FoxPro 9.0. он успешно выполняется:

  CopyCode imageКопировать Код
CREATE CURSOR MyCursor (field1 I)
INSERT INTO MyCursor VALUES (0)

CREATE CURSOR MyCursor1 (field1 I)
INSERT INTO MyCursor1 VALUES (1)

CREATE CURSOR MyCursor2 (field1 I)
INSERT INTO MyCursor2 VALUES (2)

SELECT * FROM MyCursor T1 WHERE EXISTS ;
(SELECT * from MyCursor1 T2 WHERE NOT EXISTS ;
(SELECT * FROM MyCursor2 T3))

*** Another multiple subquery nesting example ***
SELECT * FROM table1 WHERE table1.iid IN ;
(SELECT table2.itable1id FROM table2 WHERE table2.iID IN ;
(SELECT table3.itable2id FROM table3 WHERE table3.cValue = "value"))

Секция GROUP BY в Коррелированном ПодЗапросе:

Многие Запросы могут быть оценены как успешно выполняемые в зависимости от содержания ПодЗапроса или от изменяемого Значения в секции WHERE Родительского Запроса. В Запросах, содержащих Коррелированные ПодЗапросы (называемые также Повторяющимися Подзапросами), выполнение подзапроса существенно зависит от значений некоторых элементов Родительского Запроса. Это означает, что указанный ПодЗапрос выполняется многократно, для каждой результирующей Записи Родительского Запроса.

В версии Visual FoxPro 8.0 не допускалось использование выражения GROUP BY в Коррелированном ПодЗапросе, и возникала Ошибочная ситуация = 1828 (SQL: недопустимое использование выражения GROUP BY в ПодЗапросе). В версии Visual FoxPro 9.0 указанное ограничение снято, рассматриваемое выражение GROUP BY может эффективно использоваться в коррелированных подзапросах, в резельтирующий наборе данных включаются уже более одной Записи.

Далее приводится поддерживаемая теперь синтаксическая конструкция команды SQL с секцией GROUP BY в коррелированном Подзапросе.

SELECT … WHERE … (SELECT … WHERE … GROUP BY …) …

Пример:

Следующий программный Код приводит к ошибке в версии Visual FoxPro 8.0, Но успешно выполняется в версии Visual FoxPro 9.0.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL
CREATE CURSOR MyCursor1 (field1 I, field2 I, field3 I)
INSERT INTO MyCursor1 VALUES(1,2,3)
CREATE CURSOR MyCursor2 (field1 I, field2 I, field3 I)
INSERT INTO MyCursor2 VALUES(1,2,3)

SELECT * from MyCursor1 T1 WHERE field1;
IN (SELECT MAX(field1) FROM MyCursor2 T2 ;
WHERE T2.field2=T1.FIELD2 GROUP BY field3)

Секция TOP N в НеКоррелированных ПодЗапросах:

Версия Visual FoxPro 9.0 поддерживает теперь секцию TOP N в некоррелированных ПодЗапросах. Требуется использовать выражение ORDER BY если указывается рассматриваемая конструкция TOP N; Это единственный случай, при использовании ее в Подзапросах.

Далее представлена основная синтаксическая Конструкция использования утверждения TOP N в некоррелированных Подзапросах.

SELECT … WHERE … (SELECT TOP nExpr [PERCENT] … FROM … ORDER BY …) …

Пример:

Следующий программный код приводит к Ошибке в версии Visual FoxPro 8.0; однако - успешно выполняется в версии Visual FoxPro 9.0.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL
CREATE CURSOR MyCursor1 (field1 I, field2 I, field3 I)
INSERT INTO MyCursor1 VALUES(1,2,3)
CREATE CURSOR MyCursor2 (field1 I, field2 I, field3 I)
INSERT INTO MyCursor2 VALUES(1,2,3)

SELECT * FROM MyCursor1 WHERE field1 ;
IN (SELECT TOP 5 field2 FROM MyCursor2 order by field2)

Подзапросы в Списках столбцов команды SELECT:

Версия Visual FoxPro 9.0 теперь допускает Подзапросы, как Столбцы или части выражения в Результирующем наборе (списке столбцов). Значение ПодЗапроса оценивается по тем же правилам, как и в операциях Сравнения. Если Подзапрос не возвращает ни одной Записи, то возвражается стандартное значение =  NULL.

При использовании описанной выше конструкции в версии Visual FoxPro 8.0, возникаент Ошибочная ситуация = 1810 (SQL: Неверное использование ПодЗапроса).

Далее приводится общая допустимая синтаксическая конструкция Списка столбцов в команде SELECT.

SELECT … (SELECT …) … FROM …

Пример:

Следущий далее программный Код приводит к ошибке в версии Visual FoxPro 8.0; однако - успешно выполняется в версии Visual FoxPro 9.0.

  CopyCode imageКопировать Код
SELECT T1.field1, (SELECT field2 FROM MyCursor2 T2;
WHERE T2.field1=T1.field1) FROM MyCursor1 T1

Использование Агрегатных Функций в Подзапросах, как столбцов в команде SELECT:

Теперь, в версии Visual FoxPro 9.0, поддерживаются агрегатные функции в Конструкциях Подзапросов используемых в выражених сравнения  <, <=, >, >=, а также ALL, ANY, или SOME. Смотрите дополнительно подраздел по использованию агрегатных функций: Соглашения для Операторов SQL SELECT.

Пример:

Далее приводится программный Код, в котором используется агрегатная функция COUNT( ), как  элемент Списка Подзапроса SELECT.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL 

CREATE CURSOR MyCursor (FIELD1 i)
INSERT INTO MyCursor VALUES (6)
INSERT INTO MyCursor VALUES (0)
INSERT INTO MyCursor VALUES (1)
INSERT INTO MyCursor VALUES (2)
INSERT INTO MyCursor VALUES (3)
INSERT INTO MyCursor VALUES (4)
INSERT INTO MyCursor VALUES (5)
INSERT INTO MyCursor VALUES (-1)

CREATE CURSOR MyCursor2 (FIELD2 i)
INSERT INTO MyCursor2 VALUES (1)
INSERT INTO MyCursor2 VALUES (2)
INSERT INTO MyCursor2 VALUES (2)
INSERT INTO MyCursor2 VALUES (3)
INSERT INTO MyCursor2 VALUES (3)
INSERT INTO MyCursor2 VALUES (3)
INSERT INTO MyCursor2 VALUES (4)
INSERT INTO MyCursor2 VALUES (4)
INSERT INTO MyCursor2 VALUES (4)
INSERT INTO MyCursor2 VALUES (4)

SELECT * FROM MYCURSOR WHERE field1;
< ALL (SELECT count(*) FROM MyCursor2 GROUP BY field2) ;
INTO CURSOR MyCursor3
BROWSE

Коррелированные Подзапросы допускают теперь сложные Выражения Сравнения с коррелированным Полем:

В версии Visual FoxPro 8.0, ссылки на коррелируемые Поля (столбцы) могли быть указаны только в следующих Случаях:

Коррелируемое Поле <оператор сравнения> Локальное Поле

-или-

Локальное Поле <оператор сравнения> Коррелируемое Поле

В версии Visual FoxPro 9.0, в выражениях Сравнения, допускаются более сложные Конструкции, локальные поля, корреляционные поля, выражения:

Коррелируемое Поле <оператор сравнения> Локальное выражение

-или в форме-

Локальное выражение <оператор сравнения> Коррелируемое Поле

В локальном выражении должна быть использована по крайней мере одна ссылка на локальное Поле, и не может быть использована ссылка на Итоговый (коррелированный) Столбец результирующего Набора.

Пример:

В представленном Коде локальное выражение (MyCursor2.field2 / 2) сравнивается с итоговым Полем (Столбцом) (MyCursor.field1).

  CopyCode imageКопировать Код
SELECT * FROM MyCursor ;
WHERE EXISTS(SELECT * FROM MyCursor2 ;
WHERE MyCursor2.field2 / 2 > MyCursor.field1)

Нововведения для сравниваемых выражений при использовании Подзапросов:

В версии Visual FoxPro 8.0, в левой части выражения сравнения при использовании операторов сравнения: [NOT] IN, <, <=, =, ==, <>, !=, >=, >, ALL, ANY, SOME и Подзапроса, указанного в правой части, может быть использована ссылка на Одну, и только Одну Таблицу из соответствующей секции FROM. В случае сравнения с коррелированным Подзапросом, данная Таблица должны быть также Коррелированной.

В версии Visual FoxPro 9.0, конструкции Сравнения работают в следующизх Режимах:

  • Выражение, размещенное в левой части конструкции сравнения IN должна содержать ссылку по крайней мере на Одну Таблицу, из соответствующей секции FROM.

  • Аналогично, в левой части выражения сравнения, использующего операторы =, ==, <>, !=, а также: ALL, SOME, ANY должна быть указана ссылка по крайней мере на Одну Таблицу из секции FROM.

  • Аналогично, в левой части выражения сравнения, использующего операторы >, >=, <, <=, а также:  ALL, SOME, ANY (SELECT TOP…) должна быть указана ссылка по крайней мере на Одну Таблицу из секции FROM.

  • Аналогично, в левой части выражения сравнения, использующего операторы >, >=, <, <=, а также: ALL, SOME, ANY (SELECT <агрегатная функция>…) должна быть указана ссылка на по крайней мере на Одну Таблицу из Секции FROM.

  • Аналогично, в левой части выражения сравнения, использующего операторы >, >=, <, <=, а также: ALL, SOME, ANY (для подзапросов с использованием GROUP BY и/или HAVING) должна быть указана ссылка по крайней мере на ОДдну Таблицу из секции FROM.

В версии Visual FoxPro 9.0, когда левая часть выражения сравнения не содержит списка требуемых Значений (например, для конструкций типа ALL, SOME, ANY) не требуется указание ссылки на хотя бы одну Таблицу из секции FROM.

Во всех остальных случаях, в левой части Сравнения, может быть указано не более одной ссылки на Таблицу из соответствующей секции FROM. Для коррелированных Подзапросов, левая часть сравнения не может содержать ссылку на столбец Коррелированной Таблицы (коррелированной - итоговой, результирующей).

Использование Подзапросов в командах UPDATE - SQL, подсписках SET:

В версии Visual FoxPro 9.0, смотрите подраздел: UPDATE - SQL, команда, теперь поддерживаются Подзапросы в секции SET.

Подзапросы в секциях SET должны удовлетворять тем же требованиям,ераций Сравнения. Если Подзапрос не возвращает результирующих Записей, то возвращается значение = NULL.

Только один Подзапрос допустим в секции SET. Если в данной секции SET используется Подзапрос, то утверждение типа  WHERE недопустимо.

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

UPDATE … SET … (SELECT …) …

Пример:

Далее представлен пример программного кода, демонстрирующий использование Подзапроса в секции SET, для команды UPDATE - SQL:

  CopyCode imageКопировать Код
CLOSE DATA
CREATE CURSOR MyCursor1 (field1 I , field2 I NULL)

INSERT INTO MyCursor1 VALUES (1,1)
INSERT INTO MyCursor1 VALUES (2,2)
INSERT INTO MyCursor1 VALUES (5,5)
INSERT INTO MyCursor1 VALUES (6,6)
INSERT INTO MyCursor1 VALUES (7,7)
INSERT INTO MyCursor1 VALUES (8,8)
INSERT INTO MyCursor1 VALUES (9,9)

CREATE CURSOR MyCursor2 (field1 I , field2 I)

INSERT INTO MyCursor2 VALUES (1,10)
INSERT INTO MyCursor2 VALUES (2,20)
INSERT INTO MyCursor2 VALUES (3,30)
INSERT INTO MyCursor2 VALUES (4,40)
INSERT INTO MyCursor2 VALUES (5,50)
INSERT INTO MyCursor2 VALUES (6,60)
INSERT INTO MyCursor2 VALUES (7,70)
INSERT INTO MyCursor2 VALUES (8,80)

UPDATE MyCursor1 SET field2=100+(SELECT field2 FROM MyCursor2 ;
WHERE MyCursor2.field1=MyCursor1.field1) WHERE field1>5

SELECT MyCursor1
LIST

Expand imageСоставные (вложенные) конструкции SELECT в секциях FROM:

В составных конструкциях SELECT часто появляются ссылки на различные Таблицы. Различные Таблицы в операторе SELECT указываются в секции FROM, которые задаются в виде Алиасов или пользовательских Имен. Результирующий Набор оператора SELECT, с использованием таблиц из секции FROM, создается при помощи Внешнего Объединения  SELECT (Outer Select). Версия Visual FoxPro 9.0 обеспечивает использовани Подзапросов в секции FROM.

Составные конструкции SELECT указываются в круглых скобках и требуют обязательного указания результирующего  Алиаса главного Оператора. Корреляция не поддерживается. Для составных (вложенных) операторов SELECT действителен синтаксис и Ограничения, как для обычного SQL - SELECT, но оганичения на Подзапросы не не поддерживаются. Все составные (вложеные) конструкции SELECT должны выполняться до выполнения Главного оператора SELECT.

Далее представлена каноническая, синтаксическая конструкция для составного (вложенного) Подзапроса в секции FROM.

SELECT … FROM (SELECT …) [AS] Alias…

Пример:

Далее представлен пример использования вложенного SQL-SELECT из секции FROM.

  CopyCode imageКопировать Код
SELECT * FROM (SELECT * FROM MyCursor T1;
WHERE field1 = (SELECT T2.field2 FROM MyCursor1 T2;
WHERE T2.field1=T1.field2);
UNION SELECT * FROM MyCursor2;
ORDER BY 2 desc) AS subquery

*** Note that the following code will generate an error ***
SELECT * FROM (SELECT TOP 5 field1 FROM MyCursor) ORDER BY field1

Expand imageКонструкция ORDER BY с именами Полей в секции UNION:

При использовании секции UNION в версии Visual FoxPro 8.0, вы были вынуждены использовать Номера результирующих Столбцов для определения необходимой Сортировки, определяемой в секции ORDER BY. В версии Visual FoxPro 9.0, описанное ограничение снято и вы можете указавать Имена результирующих Столбцов.

Требуемые имена столбцов сортировки должны быть определены в итоговом Списке результирующего оператора SELECT (последнего при использовании конструкций UNION); только после этого данные Столбцы могут быть указаны в секции Сортировки ORDER BY.

Пример:

Далее представлен пример использования имен итоговых столбцов для определения режимов Сортировки в секции ORDER BY.

  CopyCode imageКопировать Код
CLOSE DATABASES all
CREATE CURSOR MyCursor(field1 I,field2 I)
INSERT INTO MyCursor values(1,6)
INSERT INTO MyCursor values(2,5)
INSERT INTO MyCursor values(3,4)

SELECT field1, field2, .T. AS FLAG,1 FROM MyCursor;
WHERE field1=1;
UNION ;
SELECT field1, field2, .T. AS FLAG,1 FROM MyCursor;
WHERE field1=3;
ORDER BY field2 ;
INTO CURSOR TEMP READWRITE

BROWSE NOWAIT

Expand imageОптимизация выполнения конструкции TOP N:

В версии Visual FoxPro 8.0, и в более младших версиях, когда используется конструкция TOP N [PERCENT], сначала выполняется выборка и сортировка всех Результирующих Записей, а потом извлекаются требуемые (TOP N). В версии Visual FoxPro 9.0, выполнение подобных SQL-SELECT значительно улучшено, увеличена скорость выборки, за счет Исключающих Записей (Eliminating Records), которые изначально отбрасываются и не участвуют в формировании результирующего Набора, создаваемого по конструкции TOP N, исключаются из процесса сротировуки на ранних стадиях выполнения Запроса.

Конструкция TOP N оптимизируется только в том случа, когда для стандартной команды SET ENGINEBEHAVIOR установлено значение = 90.

Оптимизация требует, чтобы конструкция TOP N возвращала не более чем N записей в Результирующем Наборе (что недействительно для версии  Visual FoxPro 8.0 и более ранних версий), когда же определено  SET ENGINEBEHAVIOR = 90, то процессы оптимизации Включаются.

Секция TOP N PERCENT не может быть Оптимизирована, если результирующий Набор не поместим целиком в оперативную память Рабочей Станции.

Expand imageУлучшенная Оптимизация выборки из нескольких Таблиц с составными условиями типа OR (или)

Версия Visual FoxPro 9.0 обеспечивает улучшение Оптимизации типа Rushmore для многотабличных Выборок с условными конструкциями OR (ИЛИ). Visual FoxPro использует оптимизацию Rushmore для фильтрованных сложных составных Условий типа OR для обоих сторон определяющих условия выборки; в данном случае возможна Улучшенная Оптимизация. Следующий далее пример иллюстрирует вышесказанное:

  CopyCode imageКопировать Код
CLEAR
CREATE CURSOR Test1 (f1 I)
FOR i=1 TO 20
  INSERT INTO Test1 VALUES (I)
NEXT
INDEX ON f1 TAG f1
CREATE CURSOR Test2 (f2 I)
FOR i=1 TO 20
  INSERT INTO Test2 VALUES (I)
NEXT
INDEX ON f2 TAG f2
SYS(3054,12)
SELECT * from Test1, Test2 WHERE (f1 IN (1,2,3) AND f2 IN (17,18,19)) OR ;
  (f2 IN (1,2,3) AND f1 IN (17,18,19)) INTO CURSOR Result
SYS(3054,0)

По представленному Сценарию выполнения Запроса, выборка из Таблицы Test1 может быть оптимизированапо Rushmore; для этого рекомендуется использовать следующие Оптимизируемые Конструкции:

(f1 IN (1,2,3)  OR f1 IN (17,18,19))

А для Таблицы Test2 - можно использовать следующую Оптимизацию:

(f2 IN (17,18,19) OR f2 IN (1,2,3))

Expand imageПоддержка для Локально Буферизованных Данных (Local Buffered Data):

Иногда, бывает полезно пользоваться Запросами SELECT - SQL для получения Данных из Таблиц, которые не изменяются в текущий момент (данные - статичные), таблицы представлены в виде буферизованных Курсоров. Во многих случаях, когда создаются Контролы типа Сетка (Grid), Списки (ListBox/ComboBox), указанные Курсоры могут содержать несколько новых Записей, которые еще не отражены на Диске (пока не ваполнена Запись на Диск). Однако, в текущий момент, оператор SQL основан на реальных данных, которые уже отображены на Диске.

Версия Visual FoxPro 9.0 обеспечивает расширения Языка (Visual FoxPro), для поддержки актуальных данных в динамических конструкциях SELECT - SQL, которые основаны либо на новых данных из буферов Курсоров или на данных с Диска.

Новый синтаксис команды SELECT - SQL теперь поддерживает секцию WITH … BUFFERING, которая позволяет контролировать обновление Данных на Диске и Буферах. Дополнительную информацию смотрите в разделе: SELECT - SQL, команда, - WITH, секция.

Если вы не используете указание параметра BUFFERING, процесс загружаемых данных определяется согласно Сценарию, определяемому текущей установкой команды SET SQLBUFFERING. Дополнительно смотрите раздел: SET SQLBUFFERING, команда.

Expand imageРасширение других Команд SQL (Visual FoxPro)

В текущем разделе описываются расширения для команд: INSERT - SQL, команда, UPDATE - SQL, команда, и DELETE - SQL, команда, действительные для версии Visual FoxPro 9.0.

Секция UNION в команде INSERT - SQL:

Начиная с версии Visual FoxPro 9.0, секция UNION теперь поддерживается в команде: INSERT - SQL.

Далее представлена основная синтаксическая конструкция использования секции UNION:

INSERT INTO … SELECT … FROM … [UNION SELECT … [UNION …]]

Пример:

Далее демонстрируется использование секции UNION в команде INSERT-SQL.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL
CREATE CURSOR MyCursor (field1 I,field2 I)
CREATE CURSOR MyCursor1 (field1 I,field2 I)
CREATE CURSOR MyCursor2 (field1 I,field2 I)

INSERT INTO MyCursor1 VALUES (1,1)
INSERT INTO MyCursor2 VALUES (2,2)

INSERT INTO MyCursor SELECT * FROM MyCursor1 UNION SELECT * FROM MyCursor2

SELECT MyCursor
LIST

Коррелируемые команды UPDATE - SQL:

Начиная с версии Visual FoxPro 9.0 поддерживаются Корреляционные Изменения Данных при помощи соответствующей команды UPDATE - SQL.

Если секция FROM включена в команду UPDATE -SQL, тогда имя, следующее после ключевого слова UPDATE определяет наименование результирующего набора данных операции Изменения. Это может быть именем Таблицы, именем Алиаса, или именем файла данных. Следующая логическая цепочка может быть использована для выбора результирующей таблицы:

  • Если указанное Имя явно или неявно совпадает с именем Таблицы, указанной в секции FROM, тогда эта таблицы используется как результирующий набор в операции Изменения (UPDATE SQL).

  • Если Имя соответствует имени алиаса Курсора из текущей Сессии Данных, тогда этот Курсор - результирующий набор.

  • Если указано имя Таблицы или Файла, то данное имя используется в качестве результирующего набора.

В команде UPDATE -SQL, секция FROM имеет аналогичный синтаксис, как и секция FROM в команде SELECT - SQL, за исключением следующих Ограничений:

  • Результирующая Таблица или Курсор не могут быть включены в качестве второстепенного (присоединяемого) Набора Данных в утверждении OUTER JOIN.

  • Результирующий Курсор не может быть Результатом ПодЗапроса.

  • Все другие присоединяемые Элементы (JOIN) должны быть уже вычислены, до определения Результирующего набора.

Действителен следующий общий синтаксис для команды SQL- UPDATE.
UPDATE … SET … FROM … WHERE …

Пример:

Далее представлен пример Корреляционного Изменения Данных с помощью команды: UPDATE -SQL.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL

CREATE CURSOR MyCursor1 (field1 I , field2 I NULL,field3 I NULL)
INSERT INTO MyCursor1 VALUES (1,1,0)
INSERT INTO MyCursor1 VALUES (2,2,0)
INSERT INTO MyCursor1 VALUES (5,5,0)
INSERT INTO MyCursor1 VALUES (6,6,0)
INSERT INTO MyCursor1 VALUES (7,7,0)
INSERT INTO MyCursor1 VALUES (8,8,0)
INSERT INTO MyCursor1 VALUES (9,9,0)

CREATE CURSOR MyCursor2 (field1 I , field2 I)
INSERT INTO MyCursor2 VALUES (1,10)
INSERT INTO MyCursor2 VALUES (2,20)
INSERT INTO MyCursor2 VALUES (3,30)
INSERT INTO MyCursor2 VALUES (4,40)
INSERT INTO MyCursor2 VALUES (5,50)
INSERT INTO MyCursor2 VALUES (6,60)
INSERT INTO MyCursor2 VALUES (7,70)
INSERT INTO MyCursor2 VALUES (8,80)

CREATE CURSOR MyCursor3 (field1 I , field2 I)
INSERT INTO MyCursor3 VALUES (6,600)
INSERT INTO MyCursor3 VALUES (7,700)

UPDATE MyCursor1 SET MyCursor1.field2=MyCursor2.field2, field3=MyCursor2.field2*10 FROM MyCursor2 ;
WHERE MyCursor1.field1>5 AND MyCursor2.field1=MyCursor1.field1

SELECT MyCursor1
LIST

UPDATE MyCursor1 SET MyCursor1.field2=MyCursor3.field2 FROM MyCursor2, MyCursor3 ;
WHERE MyCursor1.field1>5 AND MyCursor2.field1=MyCursor1.field1 AND MyCursor2.field1=MyCursor3.field1

SELECT MyCursor1
LIST

Корреляционные команды DELETE - SQL:

Начиная с версии Visual FoxPro 9.0, теперь поддерживается Корреляционное Удаление с помощью команды DELETE - SQL.

Если в секции FROM указана более чем одна таблица, тогда Имя, заданное сразу за ключевым словом DELETE является обязательным для успешного выполнения операции удаления. Данное имя может указывать: на имя Таблицы, Алиаса Рабочей Области или имя файла Данных. Рекомендуется поддерживаться следующей Логике:

  • Если указанное Имя, явно или неявно, соответствует Таблице, указанной в секции FROM, тогда эта таблица является результирующим набором при операции Удаления.

  • Если Имя соответствует Алиасу Курсора для текущей Сессии Данных, тогда этот курсор является результирующим Набором.

  • Указанное явно имя Таблицы или файла Данных является результирующим набором.

Синтаксис секции FROM для команды DELETE -SQL подчиняется аналогичным правилам для секции FROM рассмотренной выше команды SELECT - SQL, но имеют место следующие Ограничения:

  • Результирующий курсор или Таблица не могут быть второстепенным (присоединяемым) элементом в утверждении OUTER JOIN.

  • Результирующий Курсор не может быть результирующим набором Подзапроса.

  • Для возможности использования результирующего Курсора в конструкциях Объединения, все прочие Элементы JOIN должны быть определены до вычисления рассматриваемого Курсора.

Для данного случая справедлива следующая синтаксическая Конструкция команды SQL - DELETE:

DELETE [alias] FROM alias1 [, alias2 … ] … WHERE …

Пример:

Далее представлен пример корреляционной (зависимой) команды DELETE -SQL.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL 

CREATE CURSOR MyCursor1 (field1 I , field2 I NULL,field3 I NULL)
INSERT INTO MyCursor1 VALUES (1,1,0)
INSERT INTO MyCursor1 VALUES (2,2,0)
INSERT INTO MyCursor1 VALUES (5,5,0)
INSERT INTO MyCursor1 VALUES (6,6,0)
INSERT INTO MyCursor1 VALUES (7,7,0)
INSERT INTO MyCursor1 VALUES (8,8,0)
INSERT INTO MyCursor1 VALUES (9,9,0)

CREATE CURSOR MyCursor2 (field1 I , field2 I)
INSERT INTO MyCursor2 VALUES (1,10)
INSERT INTO MyCursor2 VALUES (2,20)
INSERT INTO MyCursor2 VALUES (3,30)
INSERT INTO MyCursor2 VALUES (4,40)
INSERT INTO MyCursor2 VALUES (5,50)
INSERT INTO MyCursor2 VALUES (6,60)
INSERT INTO MyCursor2 VALUES (7,70)
INSERT INTO MyCursor2 VALUES (8,80)

CREATE CURSOR MyCursor3 (field1 I , field2 I)
INSERT INTO MyCursor3 VALUES (6,600)
INSERT INTO MyCursor3 VALUES (7,700)

DELETE MyCursor1 FROM MyCursor2 ;
WHERE MyCursor1.field1>5 AND MyCursor2.field1=MyCursor1.field1

SELECT MyCursor1
LIST
RECALL ALL

DELETE MyCursor1 FROM MyCursor2, MyCursor3 ;
WHERE MyCursor1.field1>5 AND MyCursor2.field1=MyCursor1.field1 AND MyCursor2.field1=MyCursor3.field1

SELECT MyCursor1
LIST
RECALL ALL

DELETE FROM MyCursor1 WHERE MyCursor1.field1>5

SELECT MyCursor1
list
RECALL ALL

DELETE MyCursor1 from MyCursor1 WHERE MyCursor1.field1>5

RECALL ALL IN MyCursor1

DELETE T1 ;
FROM MyCursor1 T1 JOIN MyCursor2 ON T1.field1>5 AND MyCursor2.field1=T1.field1, MyCursor3 ;
WHERE MyCursor2.field1=MyCursor3.field1

RECALL ALL IN MyCursor1

Изменяемые Поля (столбцы) в команде  UPDATE - SQL:

Количество Полей, которые могут быть изменены с помощью команды UPDATE - SQL больше не ограничено числом = 128 (ограничение для версии 8). Теперь это ограничение = 255, что соответствует максимальному количеству Полей в Таблице (Visual FoxPro).

Команда SET ENGINEBEHAVIOR:

Указанная команда SET ENGINEBEHAVIOR, в версии Visual FoxPro 9.0, имеет дополнительную опцию = 90, которая влияет на поведение в команде SELECT - SQL секции TOP N и Агрегатных Функций. Смотрите дополнительную информацию по данному вопросу в разделе: SET ENGINEBEHAVIOR.

Преобразование Типов Данных:

Преобразование типов данных (например, преобразование между полем memo и символьным полем) существенно улучшено в версии Visual FoxPro 9.0. Данное преобразование обеспечивается в команде  ALTER TABLE - SQL, когда в опции COLUMN изменяется структура Таблицы, поддерживаемое в Дизайнере Таблиц.

Expand imageСм. также