Есть ли способ получить проверку математического равенства двух операторов SQL?
У меня есть два оператора SQL:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
Выполнение обоих операторов над данными и сравнение результатов не помогает вообще.
Математика, стоящая за утверждениями, должна оцениваться, как это делает решатель уравнений.
Вне моего вопроса находятся такие вещи, как:
- сравнения, отличные от равенства (больше, меньше, чем, как, ...)
- хранимые процедуры или триггеры
- Общие табличные выражения (С)
В объеме:
- Подвыбирает: ГДЕ other_id IN (ВЫБЕРИТЕ id ИЗ ДРУГОГО ГДЕ ...)
- JOINS
database-theory
guettli
источник
источник
select * from foo where id = 4
наверняка будет иметь тот же план выполнения, что иselect * from foo where id = 2
select * from foo where id = 4
иselect * from foo where id = 2
может быть два разных плана выполнения, если 1) статистика индекса не обновлена и 2) даже если статистика индекса актуальна, распределение ключей по идентификатору является односторонним (предоставленный идентификатор не является уникальным ключом).Ответы:
Каково математическое равенство двух операторов SQL? Для меня два запроса эквивалентны, если, когда им дано то же самое из любого набора данных, они возвращают один и тот же набор результатов.
Как вы указали, SQL-запросы, расширенный набор реляционной алгебры , могут быть очень сложными. Мы можем смешивать подзапросы, использовать хранимые процедуры и функции ( детерминированные или нет), которые сделают ваш запрос более похожим на реальный код . Если вы говорите об этих видах запросов, то это будет очень сложно. На самом деле это, вероятно, ничем не отличается от проблемы "эквивалент двух алгоритмов".
В этих условиях это, вероятно, невозможно.
Однако...
... это может быть осуществимо, если два запроса, которые вы хотите сравнить, являются строгими операциями над множествами. Если это так, вы можете преобразовать запросы в реляционную алгебру, а затем обработать ее, следуя правилам эквивалентности . Если у вас есть выбор / ограничение с нетривиальными логическими условиями, то вам может понадобиться доказать, что эти условия также эквивалентны. Затем вам нужно будет полагаться на булеву алгебру, и вы, вероятно, в конечном итоге составите таблицу истинности .
Как вы можете видеть, это будет большая работа, и, насколько я знаю, ничего не существует, чтобы вычислить все это автоматически. Тем не менее, я нашел некоторые инструменты, которые могут оказаться полезными, если вы хотите решить задачу:
источник
Невозможно проверить семантическую эквивалентность за конечное время по определению, см . Теорему Райса :
источник
Пользователь dba Lennart указал мне на этот проект:
http://cosette.cs.washington.edu/
источник
Один из способов сделать это - создать синтаксический анализатор или, лучше сказать, использовать существующий. Я считаю, что C # имеет класс TSQLParser и имеет метод Parse (). Парсер разбит ваш запрос на подклассы, которые вы сможете затем сравнить.
источник
Если вы ищете тест эквивалентности, основанный на теории множеств, лучше всего конвертировать любые
WHERE
условия, которые можно преобразовать в типJOIN
(внутренний или внешний), и реорганизовать утверждение. Это включаетIN subselect
иEXISTS subselect
и любые другие условия вWHERE
предложении, которое содержит словоSELECT
. Если вы выполните это для обоих операторов SQL, у вас будет новоеFROM
предложение, представляющее интересующую вас логику / математику на основе множеств. Затем вы можете просто визуально сравнить два оператора. Если вы ищете автоматизированный способ сделать все это, я не знаю инструмента, который может сделать именно это.источник