sql >> Database teknologi >  >> RDS >> PostgreSQL

Sammenlign resultatet af to tabelfunktioner ved at bruge en kolonne fra hver

Alle de følgende svar forudsætter, at rækker returneres i matching bestille.

Postgres 9.3

Med den finurlige funktion at eksplodere rækker fra SRF-funktioner, der returnerer det samme antal rækker parallelt:

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!

Parenteserne omkring rækketypen er nødvendige for at disambiguere fra en eventuel tabelreference. Detaljer i manualen her.

Dette er standard til kartesisk produkt af rækker, hvis antallet af returnerede rækker ikke er det samme (hvilket ville bryde det fuldstændigt for dig).

Postgres 9.4

MED ORDINALITET at generere rækkenumre i farten

Du kan bruge WITH ORDINALITY for at generere et rækkenummer i fluen og behøver ikke at være afhængig af at parre resultatet af SRF-funktioner i SELECT liste:

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;

Dette virker for det samme antal rækker fra hver funktion såvel som forskellige tal (hvilket vil blive talt som uoverensstemmelse).

Relateret:

RÆKKER FRA at forbinde sæt række for række

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;

Relateret svar:

Til side:
UDFØR FORMAT er ikke en sæt plpgsql-funktionalitet. RETURN QUERY er. format() er blot en praktisk funktion til at bygge en forespørgselsstreng, kan bruges hvor som helst i SQL eller plpgsql.



  1. Oracle DB til EF fungerer ikke korrekt for NUMBER(2,0)

  2. Indsæt trigger for at opdatere en anden tabel ved hjælp af PostgreSQL

  3. SQL Filtrer kriterier i joinkriterier eller where-klausul, som er mere effektiv

  4. MySQL FIND_IN_SET() fungerer ikke som forventet