sql - multiple - Seleccione sin una cláusula FROM en Oracle
pivot oracle columns to rows (6)
es una buena práctica usar la mesa dual
Sí, la mesa doble generalmente se usa para este propósito exacto. Es bastante estándar en Oracle cuando no tiene ninguna tabla para seleccionar.
en SQL Server es posible ejecutar un SELECT, sin referencia a una tabla; algo como:
Select 1.2 +3, ''my dummy string''
Como Oracle no permite un SELECT sin un FROM, utilizo la tabla dual para este tipo de operación; algo como:
Select 1,2+3, ''my dummy string'' FROM DUAL
Hay una mejor manera de hacer este tipo de consulta? ¿es una buena práctica usar la mesa doble?
Creo que debes usar dual. se usa cuando necesita ejecutar SQL que no tiene un nombre de tabla. No puedo decir que lo use mucho más que en las secuencias de comandos SQL para repetir la fecha en que algo se ejecuta o algo así de estúpido.
En realidad, la implementación de SQL Server no es estándar. El estándar SQL-92 (Sección 7.9) requiere una cláusula FROM en una instrucción SELECT. DUAL es la forma de Oracle de proporcionar una tabla para seleccionar para obtener una fila escalar.
No, en Oracle
no hay SELECT
sin FROM
.
Usar la mesa dual
es una buena práctica.
dual
es una tabla en memoria. Si no selecciona DUMMY
, utiliza una ruta de acceso especial ( FAST DUAL
) que no requiere I/O
Érase una vez, el dual
tenía dos registros (de ahí el nombre) y estaba destinado a servir como un conjunto de registros ficticio para duplicar los registros que se unen.
Ahora solo tiene un registro, pero aún puede generar un número arbitrario de filas con él:
SELECT level
FROM dual
CONNECT BY
level <= 100
MySQL
también admite dual
(así como la sintaxis fromless).
Sí, la tabla dual es la forma habitual de hacer esto en Oracle. De hecho, fue presentado solo para esto.
La principal ventaja de DUAL es que el optimizador en Oracle sabe que es especial, por lo que las consultas que lo usan pueden ser más rápidas que si utilizara una tabla de una sola fila creada por usted mismo. Aparte de eso, no hay nada especial al respecto.
no olvides que la mayoría de las veces no necesitas usar SELECT.
En lugar de:
SELECT sysdate INTO l_date FROM dual;
SELECT CASE WHEN i = j THEN 0 ELSE 1 END INTO l_foo FROM dual;
...
puedes usar
l_date := sysdate;
l_foo := CASE WHEN i = j THEN 0 ELSE 1 END;
...