Re: Select from tableA - if not exists then tableB

From: Patrick B <patrickbakerbr(at)gmail(dot)com>
To: Brian Dunavant <brian(at)omniti(dot)com>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: Select from tableA - if not exists then tableB
Date: 2017-05-09 22:00:02
Message-ID: CAJNY3ivda3zq=PvjLJvn2z2SdeBRNVVwL+TDEHTzXi5kX9p=SQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

2017-05-09 10:19 GMT+12:00 Brian Dunavant <brian(at)omniti(dot)com>:

> From what you're saying about migrating, I'm assuming the new table
> has additional columns or something. If you can map the difference,
> then you could use CTE's to select from the first table, and if
> nothing is there, then pull from the second table and pad it with
> nulls so they "match". This should work fine in 9.1.
>
> For example:
>
> db=# create table old ( id integer );
> CREATE TABLE
> db=# create table new ( id integer, newcol text );
> CREATE TABLE
> db=# insert into old (id) values (1), (2);
> INSERT 0 2
> db=# insert into new (id, newcol) values (1, 'a');
> INSERT 0 1
>
> New table:
>
> db=# with new_check as (
> db(# select id, newcol from new where id = 1
> db(# )
> db-# select id, null::text as newcol from old where id = 1
> db-# and not exists ( select 1 from new_check )
> db-# union all
> db-# select * from new_check;
> id | newcol
> ----+--------
> 1 | a
> (1 row)
>
> Old table:
>
> db=# with new_check as (
> db(# select id, newcol from new where id = 2
> db(# )
> db-# select id, null::text as newcol from old where id = 2
> db-# and not exists ( select 1 from new_check )
> db-# union all
> db-# select * from new_check;
> id | newcol
> ----+--------
> 2 |
> (1 row)
>
> Neither:
>
> db=# with new_check as (
> db(# select id, newcol from new where id = 3
> db(# )
> db-# select id, null::text as newcol from old where id = 3
> db-# and not exists ( select 1 from new_check )
> db-# union all
> db-# select * from new_check;
> id | newcol
> ----+--------
> (0 rows)

Hmm.. that's interesting...

The query is (This is actually a view)

SELECT
split_part(n1.path::text, '/'::text, 18)::integer AS id,
split_part(n1.path::text, '/'::text, 14)::integer AS clientid,
lower(n1.md5::text)::character(32) AS md5, 0 AS cont,
'00000000-1000-1000-3000-600000000000'::uuid AS guid,
n1.bytes AS byte_count,
n1.last_modified AS last_modified
FROM tablea n1
JOIN tableb s2 ON s2.path = n1.path

Where tablec is the new one. AS you can see, there is no reference for the
new tablec on that query, so I need to:

- Get the data from the new table,
- if it is not in there, then go to old table (query above).

\d tablec:

>
> Table "public.tablec"
> Column | Type |
> Modifiers
>
> --------------------+-----------------------------+-------------------------------------------------------------------
> id | integer | not null default
> nextval('tablec_id_seq'::regclass)
> e_type | integer | not null
> e_id | bigint |
> e_variation | character varying(16) | not null
> path | character varying(255) | not null
> name | character varying(255) | not null
> size | bigint | not null
> md5 | md5_hash | not null
> modified_date | timestamp without time zone | default
> statement_timestamp()
> created_date | timestamp without time zone | default
> statement_timestamp()
> clientid | bigint | not null
> f_id | bigint |

So, will the best way to use UNION ALL?

Thanks
Patrick.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2017-05-09 23:52:14 Re: views and fdw usage and performance
Previous Message Armand Pirvu (home) 2017-05-09 21:36:59 views and fdw usage and performance