sql >> Databasteknik >  >> RDS >> PostgreSQL

Jämför resultatet av två tabellfunktioner med en kolumn från varje

Alla följande svar förutsätter att rader returneras i matchning beställa.

Postgres 9.3

Med den udda funktionen att exploderande rader från SRF-funktioner returnerar samma antal rader parallellt:

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!

Parenteserna runt radtypen är nödvändiga för att disambiguera från en eventuell tabellreferens. Detaljer i manualen här.

Detta är standard till kartesisk produkt av rader om antalet returnerade rader inte är detsamma (vilket skulle bryta det helt för dig).

Postgres 9.4

Med ORDINALITET för att generera radnummer i farten

Du kan använda WITH ORDINALITY för att generera ett radnummer direkt och behöver inte vara beroende av att para ihop resultatet av SRF-funktioner i 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;

Detta fungerar för samma antal rader från varje funktion samt olika nummer (vilket skulle räknas som oöverensstämmelse).

Relaterat:

RADER FRÅN för att sammanfoga uppsättningar rad för rad

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;

Relaterat svar:

Bortsett från:
EXEKUTFORMAT är inte en uppsättning plpgsql-funktionalitet. RETURN QUERY är. format() är bara en bekväm funktion för att bygga en frågesträng, kan användas var som helst i SQL eller plpgsql.



  1. hur man hämtar data från Oracle-databasen med PHP

  2. Presterande sätt att lista främmande nycklar för en MySQL-tabell?

  3. Klona ORACLE_HOME

  4. Kritisera min MySQL-databasdesign för obegränsade DYNAMISKA fält