PostgreSQL – Crear tabla desde un Select

PostgreSQL proporciona las cláusulas SELECT INTO y CREATE TABLE AS para crear tablas a partir del resultado de una sentencia SELECT. Las tablas creadas tendrán como estructura los campos y registros devueltos por la sentencia. Para ejemplificar esto usaremos la base de datos que hemos creado en el artículo Instalar base de datos de prueba booktown. De esta base vamos a tomar las tablas authors y books para crear una tabla única conteniendo autor y obras publicadas usando las dos claúsulas que PostgreSQL Proporciona:

CREATE TABLE AS está definido en el estándar Ansi SQL por lo que es la cláusula que se recomienda usar para la creación de tablas a partir de sentencias SELECT.  Un ejemplo de como usarla para crear una tabla a partir de una consulta tenemos la siguiente sentencia:

CREATE TABLE public.createas_autorylibro As  SELECT authors.id, 
       authors.last_name, 
       authors.first_name,
       books.title
 FROM  public.authors authors
 left join public.books books
     on authors.id = books.author_id

Como podemos ver la regla de uso es anteponer  CREATE TABLE NombreDeNuevaTabla AS  al bloque de la sentencia SELECT, de tal manera que al ejecutar el bloque se creará una nueva tabla con el nombre indicado con las columnas incluidas y los datos devueltos. En PostgreSQL a diferencia de MYSQL no se ha implementado la cláusula WITH NO DATA especificada por el estándar pero se entiende que por default se trata como si fuera WITH DATA.

SELECT INTO es la segunda cláusula que PostgreSQL nos proporciona. Su uso al igual que como vimos en SQL Server es colocando la sentencia después de la lista de campos a devolver con el SELECT. PostgreSQL establece además que pueden usarse dos parámetros adicionales: TEMP para establecer que es una tabla temporal y UNLOGGED para indicar que las operaciones en la tabla creada no se registren en el log, ganando con ello velocidad de escritura pero arriesgando que en caso de fallos la tabla no pueda recuperarse.  El código siguiente es un ejemplo de como usar esta cláusula:

SELECT authors.id, 
       authors.last_name, 
       authors.first_name,
       books.title
  INTO into_autorylibro
 FROM  public.authors authors
 left join public.books books
     on authors.id = books.author_id

Aunque el uso de ambas sentencias no difiere en gran medida, PostgreSQL recomienda usar CREATE TABLE AS ya que se ajusta al estándard ANSI SQL, además de que select into se mantiene en uso por razones de compatibilidad. Aquí una captura de pantalla con ambas tablas creadas:

postgresql-create-as

2 Comments

Deja un comentario