On Wed, Nov 18, 2015 at 11:10:47PM +0100, E.Pasma wrote:
> op 18-11-2015 21:23 schreef Richard Hipp op drh at sqlite.org:
> > The "sqldiff.exe" command-line utility has an (undocumented and
> > unsupported) "--debug 2" option that will show you the SQL that it
> > uses to do a diff between two tables.  Maybe look at that and tweak it
> > for your use?
> > 
> Does that look like this:
> SELECT * FROM
> (
> SELECT 'added' AS what, a.* FROM a
> UNION ALL 
> SELECT 'deleted', b.* FROM b
> )
> GROUP BY <all columns from a or b>
> HAVING COUNT (*)<>2
> ;

No, it looks like this when the columns are all in the primary key:

  SELECT A.a, A.b, 2 -- deleted row
    FROM main.toy A
   WHERE NOT EXISTS(SELECT 1 FROM aux.toy B
                     WHERE A.a=B.a AND A.b=B.b)
   UNION ALL
  SELECT B.a, B.b, 3 -- inserted row
    FROM aux.toy B
   WHERE NOT EXISTS(SELECT 1 FROM main.toy A
                     WHERE A.a=B.a AND A.b=B.b)
   ORDER BY 1, 2;

Else it looks like this when not all of them are in the PK:

  SELECT B.a, 1, -- changed row
         A.b IS NOT B.b, B.b
    FROM main.toy A, aux.toy B
   WHERE A.a=B.a
     AND (A.b IS NOT B.b)
   UNION ALL
  SELECT A.a, 2, -- deleted row
         NULL, NULL
    FROM main.toy A
   WHERE NOT EXISTS(SELECT 1 FROM aux.toy B
                     WHERE A.a=B.a)
   UNION ALL
  SELECT B.a, 3, -- inserted row
         1, B.b
    FROM aux.toy B
   WHERE NOT EXISTS(SELECT 1 FROM main.toy A
                     WHERE A.a=B.a)
   ORDER BY 1;

It's one UNION ALL when all columns are part of the PK, two UNION ALLs
otherwise.  sqldiff wasn't smart enough to recognize that a UNIQUE INDEX
exists (other than the PK) on all columns when it does exist, in which
case is should use the first query (one UNION ALL).

Nico
-- 

Reply via email to