Сравните результаты двух запросов с CTE и / или ORDER BY - PullRequest
1 голос
/ 29 января 2020

Проблема: сравнивает результаты двух SELECT запросов с использованием общих табличных выражений (предложение WITH), игнорируя порядок строк.

Первый подход : использовать симметрию c разность наборов строк с операторами набора Oracle (Q1 и Q2 сравниваемые запросы):

WITH A AS (Q1), B AS (Q2)
SELECT * FROM A MINUS SELECT * FROM B
UNION ALL
SELECT * FROM B MINUS SELECT * FROM A;

У этого подхода есть недостаток - мы не можем заменить запросы, у которых есть предложение WITH перед SELECT.

Второй подход: реализовать симметрию c разницу без WITH s:

(Q1) MINUS (Q2) UNION ALL (Q2) MINUS (Q1);

У этого тоже есть недостаток - мы не можем заменить запросы, имеющие предложение ORDER BY.

Я придумал только удаление всего предложения ORDER BY из запросов, а затем с использованием второго подхода. Итак, вопрос в том, какие другие подходы можно рассмотреть?

1 Ответ

1 голос
/ 29 января 2020

Oracle позволяет вкладывать предложения with в подзапросы. Таким образом, вы можете вкладывать запросы:

SELECT * FROM (Q1) MINUS SELECT * FROM (Q2)
UNION ALL
SELECT * FROM (Q2) MINUS SELECT * FROM (Q1);

Этот подход должен работать легко, если вы создаете запросы автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...