Pregunta

Realmente me gustaría saber si es posible hacer una declaración de selección, que devuelve exactamente los mismos registros, que ponemos en cláusula?

Muestra:

select * from table
where table_id in (1, 2, 3, 666);

Esta tabla de ejemplo tiene sólo id-s de 1 a 100, por lo que este selecto volverá sólo tres filas. Lo que tengo que hacer, para llegar también uno (probablemente nulo o ficticio) seguidos por 666?

Gracias!

¿Fue útil?

Solución

Se puede utilizar la unión:

select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;

es cómo podría hacerlo en Oracle. El from dual puede variar dependiendo del sistema de base de datos que está utilizando.

Ten en cuenta que si se utiliza la unión, la consulta maniquí debe seleccionar los mismos registros que la consulta real.

Otros consejos

Se puede seleccionar sin una tabla

Sólo hacer una unión con la consulta

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'

Suponiendo una numbers tabla que contiene todos los números de, por ejemplo, de 1 a 1000000 (de hecho lo suficiente para que su rango de valores de entrada está cubierta), puede ejecutar el siguiente código SQL:

SELECT *
  FROM numbers left outer join table on table.table_id = numbers.number
 WHERE numbers.number in (1, 2, 3, 666)

Si utiliza un DBMS que ofrece una mejor solución, como el correo. sol. SQL Anywhere con su procedimiento sa_rowgenerator , que puede sustituir a la numbers mesa con una llamada de procedimiento, y no tienen un límite de un número máximo.

cláusula IN es un predicado booleano, por lo que tendrá que sustituirlo por un conjunto de registros dummy:

SELECT  m.*
FROM    (
        SELECT  1 AS id
        UNION ALL
        SELECT  2 AS id
        UNION ALL
        SELECT  3 AS id
        UNION ALL
        SELECT  666 AS id
        ) q
LEFT JOIN
        mytable m
ON      m.id = q.id

En SQL Server 2008, puede ejecutar esta consulta:

SELECT  *
FROM    @mydata d
LEFT JOIN
        mytable t
ON      t.id = d.id

con @mydate es una variable de tabla, pasado como parámetro desde el cliente.

En PostgreSQL, puede ejecutar esta consulta:

SELECT  *
FROM    (
        SELECT  :arr[s] AS id
        FROM    generate_series(1, array_upper(:arr, 1)) s
        ) q
LEFT JOIN
        mytable t
ON      t.id = q.id

donde :arr es un [1, 2, 3, 666] array, también pasado desde el cliente como el parámetro.

En Oracle, que puede hacer:

SELECT  *
FROM    TABLE(:mycol) q
LEFT JOIN
        mytable t
ON      t.id = q.id

, donde :mycol es una variable de tipo colección, transcurrido desde el cliente.

Una forma de pensar que es: que había necesidad de tener que los datos de "entrar" en la consulta como un conjunto de datos. Los datos publicados en donde no se "añaden" cláusulas a la consulta, sólo se utilizan para filtrar los datos existentes a cabo.

Un ejemplo rápido:

DECLARE @MustInclude (Value  int  not null)

INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)

SELECT *
 from @MustInclude mi
  left outer join MyTable mt
   on mt.Value = mi.Value
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top