sql >> Database >  >> RDS >> PostgreSQL

Vergelijk het resultaat van twee tabelfuncties met één kolom van elk

Bij alle volgende antwoorden wordt ervan uitgegaan dat rijen worden geretourneerd in overeenkomsten bestellen.

Postgres 9.3

Met de eigenaardige eigenschap van exploderende rijen van SRF-functies die hetzelfde teruggeven aantal rijen parallel:

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!

De haakjes rond het rijtype zijn nodig om een ​​mogelijke tabelverwijzing ondubbelzinnig te maken. Details in de handleiding hier.

Dit is standaard een Cartesiaans product van rijen als het aantal geretourneerde rijen niet hetzelfde is (wat het voor u volledig zou breken).

Postgres 9,4

WITH ORDINALITY om direct rijnummers te genereren

U kunt WITH ORDINALITY . gebruiken om direct een rijnummer te genereren en niet afhankelijk te zijn van het koppelen van het resultaat van SRF-functies in de SELECT lijst:

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;

Dit werkt voor hetzelfde aantal rijen van elke functie en voor verschillende nummers (die als niet-overeenkomend worden geteld).

Gerelateerd:

ROWS FROM om rij voor rij deel te nemen aan sets

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;

Gerelateerd antwoord:

Terzijde:
EXECUTE FORMAT is geen vaste plpgsql-functionaliteit. RETURN QUERY is. format() is gewoon een handige functie voor het bouwen van een queryreeks, kan overal in SQL of plpgsql worden gebruikt.



  1. PostgreSQL-deadlocks vermijden bij het uitvoeren van bulkupdate- en verwijderingsbewerkingen

  2. Kan ik dit utf8-teken converteren?

  3. Buffert MySQL Connector/J rijen bij het streamen van een ResultSet?

  4. PHP PDO::lastInsertId() retourneert 0