sql >> Base de Datos >  >> RDS >> PostgreSQL

Compare el resultado de dos funciones de tabla usando una columna de cada una

Todas las siguientes respuestas asumen que las filas se devuelven en coincidencia orden.

Postgres 9.3

Con la característica peculiar de explotar filas de funciones SRF que devuelven el mismo número de filas en paralelo:

SELECT count(*) AS mismatches
FROM  (
   SELECT function1('tblp1','tblp2',49) AS f1
        , function2('tblp1_v2','tblp2_v2',49) AS f2
   ) sub
WHERE  (f1).dist <> (f2).dist;  -- note the parentheses!

Los paréntesis alrededor del tipo de fila son necesarios para eliminar la ambigüedad de una posible referencia de tabla. Detalles en el manual aquí.

El valor predeterminado es el producto cartesiano de filas si el número de filas devueltas no es el mismo (lo que lo rompería por completo).

Postgres 9.4

WITH ORDINALITY para generar números de fila sobre la marcha

Puedes usar WITH ORDINALITY para generar un número de fila sobre la marcha y no es necesario depender de emparejar el resultado de las funciones SRF en SELECT lista:

SELECT count(*) AS mismatches
FROM      function1('tblp1','tblp2',49)       WITH ORDINALITY AS f1(id,dist,rn)
FULL JOIN function2('tblp1_v2','tblp2_v2',49) WITH ORDINALITY AS f2(id,dist,rn) USING (rn)
WHERE  f1.dist IS DISTINCT FROM f2.dist;

Esto funciona para el mismo número de filas de cada función, así como para números diferentes (que se contarían como discrepancias).

Relacionado:

ROWS FROM para unir conjuntos fila por fila

SELECT count(*) AS mismatches
FROM   ROWS FROM (function1('tblp1','tblp2',49)
                , function2('tblp1_v2','tblp2_v2',49)) t(id1, dist1, id2, dist2)
WHERE  t.dist1 IS DISTINCT FROM t.dist2;

Respuesta relacionada:

Aparte:
EXECUTE FORMAT no es una funcionalidad plpgsql establecida. RETURN QUERY es. format() es solo una función conveniente para construir una cadena de consulta, se puede usar en cualquier lugar en SQL o plpgsql.