¿Es FROM una palabra obligatoria en los SELECT en Teradata?

La pregunta puede extrañar un poco, sobre todo después de haber discutido “¿Dónde está la tabla DUAL en Teradata?”. Pero nos referimos ahora a las ‘SELECTs’ sobre tablas. Y la respuesta a la pregunta del título, por mucho que pueda llegar a sorprender, es ‘NO‘.

Teradata presenta una sintaxis no-ANSI un poco peculiar, y esto es en lo que vamos a profundizar en esta entrada.

Aparte de lo ya dicho sobre la no necesidad de referirse a una tabla para hacer un ‘SELECT DATE’, hay más cosas sorprendentes.

Vamos primero con nuestras tablas de prueba habituales:

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT * FROM MY_DB.PRUEBA01 ORDER BY ID_N;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          1  UNO
          2  DOS
          3  TRES

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT * FROM MY_DB.PRUEBA02 ORDER BY ID_N;

 *** Query completed. 5 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          1  ONE
          2  TWO
          3  THREE
          4  FOUR
          5  FIVE

Visto esto, vamos a ver qué pasa si hacemos un select de columnas de una tabla (usando su nombre de tabla y columna) pero con un ‘FROM’ de otra tabla diferente:

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT MY_DB.PRUEBA02.*
  FROM  MY_DB.PRUEBA01
 ORDER BY 1;

 *** Query completed. 15 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          1  ONE
          1  ONE
          1  ONE
          2  TWO
          2  TWO
          2  TWO
          3  THREE
          3  THREE
          3  THREE
          4  FOUR
          4  FOUR
          4  FOUR
          5  FIVE
          5  FIVE
          5  FIVE

Justo. Ha hecho un ‘CROSS JOIN’ entre las tablas, exactamente igual que si hubiéramos hecho ‘SELECT MY_DB.PRUEBA02.* FROM MY_DB.PRUEBA01, MY_DB.PRUEBA02 ORDER BY 1’.

Pero podemos ir más allá: ¿Qué pasa si no usamos ningún ‘FROM’ pero sí un ‘WHERE’?

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT MY_DB.PRUEBA01.*
 WHERE MY_DB.PRUEBA01.ID_N=MY_DB.PRUEBA02.ID_N
 ORDER BY 1;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          1  UNO
          2  DOS
          3  TRES

Ahí lo tenemos: no hace falta el ‘FROM’, el ‘WHERE’ le basta a Teradata para saber de dónde (‘FROM’) sacar los datos.

Por otra parte, SÍ nos hará falta si intentamos hacer:

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT *
 WHERE MY_DB.PRUEBA01.ID_N=MY_DB.PRUEBA02.ID_N
 ORDER BY 1;

 *** Failure 3706 Syntax error: SELECT * must have a FROM clause.
                Statement# 1, Info =77
 *** Total elapsed time was 1 second.

Aunque siempre podríamos hacer:

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT MY_DB.PRUEBA01.*, MY_DB.PRUEBA02.*
 WHERE MY_DB.PRUEBA01.ID_N=MY_DB.PRUEBA02.ID_N
 ORDER BY 1;

 *** Query completed. 3 rows found. 4 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT                             ID_N  C_TXT
-----------  -------------------------  -----------  -------
          1  UNO                                  1  ONE
          2  DOS                                  2  TWO
          3  TRES                                 3  THREE

Por último, sin manos: sin FROM y sin WHERE (el resultado será otra vez un ‘CROSS JOIN’):

SELECT MY_DB.PRUEBA01.*, MY_DB.PRUEBA02.*
 ORDER BY 1,3;

 *** Query completed. 15 rows found. 4 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT                             ID_N  C_TXT
-----------  -------------------------  -----------  -------------------------
          1  UNO                                  1  ONE
          1  UNO                                  2  TWO
          1  UNO                                  3  THREE
          1  UNO                                  4  FOUR
          1  UNO                                  5  FIVE
          2  DOS                                  1  ONE
          2  DOS                                  2  TWO
          2  DOS                                  3  THREE
          2  DOS                                  4  FOUR
          2  DOS                                  5  FIVE
          3  TRES                                 1  ONE
          3  TRES                                 2  TWO
          3  TRES                                 3  THREE
          3  TRES                                 4  FOUR
          3  TRES                                 5  FIVE

Así pues, podemos evitar los ‘FROM’ si simplemente cualificamos las columnas del ‘SELECT LIST’:

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT MY_DB.PRUEBA01.*;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          2  DOS
          3  TRES
          1  UNO

Con lo que “‘FROM’ no es una palabra obligatoria en los SELECT en Teradata“.

De hecho, ni siquiera los ‘SELECT’ tienen que escribirse enteros (¡¿?!):

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SEL MY_DB.PRUEBA01.*;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          2  DOS
          3  TRES
          1  UNO

Aunque personalmente prefiero -y recomiendo- la ortodoxia en la sintaxis, ya que hace las cosas mucho más fáciles.

Saludos.

Carlos.

2 respuestas a ¿Es FROM una palabra obligatoria en los SELECT en Teradata?

  1. BI Fácil dice:

    Cuanto he sufrido este “feature” de Teradata…

    Por ejemplo, prueba con esta query…🙂

    SELECT sum(FACT_VENTAS.num_unidades)
    FROM FAC_VENTAS a

    O prueba esto…

    SELECT TIENDA,sum(num_unidades)
    FROM FAC_VENTAS a
    INNER JOIN TIENDAS on (TIENDA.id_tienda=FAC_VENTAS.id_tienda)
    GROUP BY 1

    Con cualwuier otro motor de de BD, daría un error de sintaxis… Teradata, en cambio, se lo traga, y hace horribles CROSS JOINS…

    Yo voto por que el FROM sea necesario…Lo contario, sólo me ha dado problemas…

    Un saludo,

    BI FACIL

  2. […] sobre FROM en Teradata Ya vimos aquí algunas de las particularidades que presenta la sintaxis Teradata (no-ANSI) con los […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: