2011-04-20 19 views
17

¿Hay alguna manera de verificar si dos selecciones (no triviales) son equivalentes?compruebe si dos "selecciones" son equivalentes

- editar -

principio yo estaba esperando una equivalencia formal entre las dos casillas, pero las respuestas en proving-sql-query-equivalency me detenga.

Para mi necesidad real, puedo verificar si los resultados (reales) de dos selecciones son los mismos.

+2

¿Desea comparar las dos cadenas SELECT? o los resultados? Proporcione más información. – wegginho

+0

'Comprobar si dos' seleccionar 's son equivalentes', dónde verificarlo en una consulta ¿Procedimiento almacenado? Ver? Sea descriptivo. –

+0

posible duplicado de [Proving SQL query equivalency] (http://stackoverflow.com/questions/56895/proving-sql-query-equivalency) –

Respuesta

26

Si desea comparar los resultados de la consulta pruebe lo siguiente:

(select * from query1 MINUS select * from query2) 
UNION ALL 
(select * from query2 MINUS select * from query1) 

Esto resultará en todas las filas que se devuelven por una sola de las consultas.

+12

Si aparecen cero filas, aún no significa que las consultas sean semánticamente equivalentes. Simplemente significa que con el conjunto de datos actual dan los mismos resultados. Sin embargo, esto podría ser lo suficientemente bueno para el póster original, pero pensé que vale la pena señalarlo. –

+0

@Rob van Wijk tienes razón, pero las tablas donde los seleccionados funcionan tienen modificaciones pequeñas (y controladas), por lo que puedo estar "realistamente" seguro de la nueva selección como una "entrada" válida de la anterior –

0

Ejecutar ambos y comparar los resultados. Use la operación EXCEPT para restar el conjunto devuelto por la primera consulta del conjunto devuelto por la segunda consulta. Si el resultado es un conjunto vacío, entonces son equivalentes.

El problema con este método es que no prueba que dos consultas son equivalentes para CUALQUIER base de datos. Depende del contenido de su base de datos. Por ejemplo, si su base de datos está vacía, entonces dos declaraciones seleccionadas son equivalentes según este método.

Demostrar la equivalencia con sólo el análisis de las consultas es un problema no resuelto que yo sepa (pero no soy exactamente un gurú de la teoría de bases de datos, así que no confía en mí en eso;)) Además, se puede echar un vistazo a esta pregunta: Proving SQL query equivalency

+1

"Si el resultado es un conjunto vacío, entonces son equivalentes". - No necesariamente, si la segunda consulta devuelve todos los registros de los primeros registros adicionales, entonces todavía obtendrá un conjunto vacío ('' 'EXCEPT''' no es conmutativa). –

3

no pudo hacer comentarios sobre la respuesta dada por HAL9000 y quería tener en cuenta que es MENOS SQL no estándar y no funciona en PostgreSQL Así que tenemos que utilizar excepto que en lugar

(select * from query1 EXCEPT select * from query2) 
UNION ALL 
(select * from query2 EXCEPT select * from query1) 
1

Para

(select * from query1 EXCEPT select * from query2) 
UNION ALL 
(select * from query2 EXCEPT select * from query1) 

he hecho un poco de juicio por postgres 9.4, y aquí están mis resultados.

[1] menos no es compatible, por lo que tenga que utilizar EXCEPT según lo dicho por @Bogdan

[2] Utilizando sólo EXCEPT no tiene en cuenta los duplicados por lo que tuvo que usar EXCEPT ALL

[3] EXCEPT ALL requieren ese orden de columna en el resultante debe ser el mismo, así que en , la consulta QUERY1 y QUERY2 deben devolver el mismo orden de columna o tenemos que ajustar la consulta y asegurarse de que el orden de las columnas sea el mismo (puede ser esto en lógica de aplicación)

Creo que si tenemos en cuenta los 3 puntos anteriores, podemos estar 100% seguros de que los datos devueltos por dos consultas en el conjunto de datos son exactamente iguales.

se actualizará si encuentro más borde caso que puede fallar.

Cuestiones relacionadas