SQL à l'article avec des lignes fictives
-
01-10-2019 - |
Question
Je voudrais vraiment savoir s'il est possible de faire une instruction select, qui renvoie exactement les mêmes dossiers que nous mettons dans article?
Exemple:
select * from table
where table_id in (1, 2, 3, 666);
Ce tableau pour un exemple n'a que id-s de 1 à 100, donc ce select retournera seulement trois lignes. Ce que je dois faire, pour obtenir également une ligne (probablement nulle ou factice) pour 666?
Merci!
La solution
Vous pouvez utiliser l'union:
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;
est de savoir comment vous pouvez le faire dans Oracle. Le from dual
peut varier en fonction du système de base de données que vous utilisez.
Il faut juste savoir que si vous utilisez l'union, votre requête factice Vous devez sélectionner les mêmes enregistrements que la requête réelle.
Autres conseils
Vous pouvez sélectionner sans table
Il suffit de faire une union avec votre requête
select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
En supposant un numbers
de table contenant tous les numéros, disons, 1-1000000 (suffisamment de fait que votre gamme de valeurs d'entrée est couverte), vous pouvez exécuter l'instruction SQL suivante:
SELECT *
FROM numbers left outer join table on table.table_id = numbers.number
WHERE numbers.number in (1, 2, 3, 666)
Si vous utilisez un SGBD qui offre une meilleure solution, comme e. g. SQL Anywhere avec elle procédure de sa_rowgenerator, vous pouvez remplacer la table numbers
avec un appel de procédure, et ne pas la limite d'un nombre maximum.
clause de IN
est un prédicat booléen, vous aurez donc besoin de le remplacer par un mannequin recordset:
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
Dans SQL Server 2008
, vous pouvez exécuter cette requête:
SELECT *
FROM @mydata d
LEFT JOIN
mytable t
ON t.id = d.id
avec @mydate
est une variable de table, passée en paramètre à partir du client.
Dans PostgreSQL
, vous pouvez exécuter cette requête:
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
où :arr
est un [1, 2, 3, 666]
de réseau, également transmis à partir du client en tant que paramètre.
Dans Oracle
, vous pouvez faire:
SELECT *
FROM TABLE(:mycol) q
LEFT JOIN
mytable t
ON t.id = q.id
, où :mycol
est une variable de type de collection, passé par le client.
Une façon de penser est: vous aurez besoin d'avoir ces données « enter » la requête comme un ensemble de données. Données trouvées dans les clauses where ne sont jamais « ajoutée » à la requête, ils ne sont utilisés que pour filtrer les données existantes sur.
Un exemple rapide:
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