sql >> Databáze >  >> RDS >> PostgreSQL

Porovnejte výsledek dvou tabulkových funkcí pomocí jednoho sloupce z každé

Všechny následující odpovědi předpokládají, že řádky jsou vráceny v odpovídajících objednávka.

Postgres 9.3

Díky svérázné funkci rozkládání řádků z funkcí SRF vracejících stejné počet paralelních řádků:

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!

Závorky kolem typu řádku jsou nutné k odlišení od možného odkazu na tabulku. Podrobnosti v příručce zde.

Pokud počet vrácených řádků není stejný, použije se jako výchozí kartézský součin řádků (což by to pro vás úplně porušilo).

Postgres 9.4

WITH ORDINALITY generovat čísla řádků za běhu

Můžete použít WITH ORDINALITY k vygenerování čísla řádku za běhu a nemusíte se spoléhat na párování výsledku funkcí SRF v SELECT seznam:

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;

Funguje to pro stejný počet řádků z každé funkce i pro různá čísla (což by se počítalo jako neshoda).

Související:

ROWS FROM ke spojení sad řádek po řádku

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;

Související odpověď:

Stranou:
EXECUTE FORMAT není nastavena funkce plpgsql. RETURN QUERY je. format() je pouze pohodlná funkce pro vytváření řetězce dotazu, lze ji použít kdekoli v SQL nebo plpgsql.



  1. Jak zastavit PHP v přidávání prázdných řádků/polí do databáze MYSQL

  2. Základní připojení PDO k MySQL

  3. Vkládání do Oracle Nested Table v Javě

  4. Hromadné vkládání polí pevné šířky