Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Приведение SQL-запроса к каноническому виду / 7 сообщений из 7, страница 1 из 1
13.02.2008, 20:42
    #35131202
Olgerda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
Возникла проблема: необходимо сравнить 2 SQL-запроса, написанные разными людьми, причем один из них (образец) находится в каноническом виде. Для этого нужно привести проверяемый запрос к каноническому виду.
Как разобрать на лексемы и как построить структуру - это понятно, но как найти алгоритм для преобразования запроса?
Может кто сталкивался с подобной проблемой?

Для примера привожу 2 эквивалентных по результатам запроса:
Код: plaintext
1.
2.
SELECT DISTINCT SPJ.SNUM
FROM SPJ, SPJ AS SPJ_1
WHERE (((SPJ_1.SNUM)=[spj].[snum]) AND ((SPJ.JNUM)="J1") AND ((SPJ_1.JNUM)="J2"));
и
Код: plaintext
1.
2.
3.
SELECT SPJ.SNUM
FROM SPJ
WHERE (((SPJ.SNUM) In (select snum from spj where jnum="J2")) AND ((SPJ.JNUM)="J1"));
...
Рейтинг: 0 / 0
13.02.2008, 23:51
    #35131416
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
OlgerdaВозникла проблема: необходимо сравнить 2 SQL-запроса, написанные разными людьми, причем один из них (образец) находится в каноническом виде. Для этого нужно привести проверяемый запрос к каноническому виду.
Как разобрать на лексемы и как построить структуру - это понятно, но как найти алгоритм для преобразования запроса?
Может кто сталкивался с подобной проблемой?

Для примера привожу 2 эквивалентных по результатам запроса:
Код: plaintext
1.
2.
SELECT DISTINCT SPJ.SNUM
FROM SPJ, SPJ AS SPJ_1
WHERE (((SPJ_1.SNUM)=[spj].[snum]) AND ((SPJ.JNUM)="J1") AND ((SPJ_1.JNUM)="J2"));
и
Код: plaintext
1.
2.
3.
SELECT SPJ.SNUM
FROM SPJ
WHERE (((SPJ.SNUM) In (select snum from spj where jnum="J2")) AND ((SPJ.JNUM)="J1"));

Самое простое решение об эквивалентности запросов заключается в их выполнении на нескольких разных тестовых комбинациях. Если получаемые результаты равны, то с некоторой долей вероятности можно утверждать их тождество. А привести все возможные варианты запросов к одному виду, практически из области фантастики. Не в смысле, что это невозможно в принципе, но, IMHO, это будет очень дорогой задачей. Разумеется, если решать ее в общем виде, а не рассматривать ограниченное число вариантов, не содержащих "шумов"(когда запрос будет содержать лишние слияния, никак не влияющие на получаемый результат).
...
Рейтинг: 0 / 0
14.02.2008, 03:28
    #35131503
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
Формально, это разные, не приводимые запросы. Одинаковые результаты в этих запросах получились либо случайно, либо в силу наличия ограничений целостности, которые обеспечили создание удачного набора данных.

В общем случае преобразованием выражений (для SQL обычно с целью ускорения кода) занимается каждый оптимизирующий компилятор. Так что ответ ищи в теории компиляторов. Для Оракла в первом приближении можно сравнивать планы выполнения запросов. Если план одного запроса может применяться для выполнения другого запроса, то запросы частично совпадают.
...
Рейтинг: 0 / 0
14.02.2008, 18:44
    #35133942
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
Olgerda пишет:
> Возникла проблема: необходимо сравнить 2 SQL-запроса, написанные разными
> людьми, причем один из них (образец) находится в каноническом виде. Для
> этого нужно привести проверяемый запрос к каноническому виду.
> Как разобрать на лексемы и как построить структуру - это понятно, но как
> найти алгоритм для преобразования запроса?

Вообще, тема хорошая такая, на дисер потянет !
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.02.2008, 18:56
    #35133963
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
Olgerda wrote:
> Для примера привожу 2 эквивалентных по результатам запроса:
кстате, они вроде неэквивалтенты...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
15.02.2008, 00:50
    #35134350
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
locky
Olgerda wrote:
> Для примера привожу 2 эквивалентных по результатам запроса:
кстате, они вроде неэквивалтенты...Угу.
...
Рейтинг: 0 / 0
15.02.2008, 01:08
    #35134357
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение SQL-запроса к каноническому виду
Чисто интуитивно, преобразоваваь и приводить к некоторому каноническму виду можно
только запросы с INNER JOIN и NOT NULL. Дальше остановиться на дизъюнктивной (например) форме запроса.
Применить кванотры существования для IN и EXSIST. Потом помудрить с утсранением пересекабщихся условий. И бегом на Нобеля.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Приведение SQL-запроса к каноническому виду / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]