2010-07-28 7 views
-1

J'ai une instruction sql comme ci-dessous. Comment puis-je ajouter une seule ligne (code = 0, desc = 1) au résultat de cette instruction sql sans utiliser le mot-clé union? Merci.Comment écrire une instruction Sql sans utiliser union?

select code, desc 
from material 
where material.ExpireDate ='2010/07/23' 
+3

Pourquoi ne pas utiliser 'UNION'? Entretien? – pascal

+0

UNION est parfois mal traité par les fournisseurs de base de données, par exemple TClientDataSet + TDataSetProvider dans Delphi – too

+2

Qu'en est-il d'une procédure stockée retournant un jeu de résultats? Ou en ajoutant cette pseudo-ligne dans le code de l'appelant? BTW n'avez-vous pas de problème en utilisant 'DESC' comme nom de colonne comme déjà un mot-clé SQL? – pascal

Répondre

3

Vous pouvez toujours créer une vue pour votre table qui utilise lui-même UNION mot-clé

CREATE VIEW material_view AS SELECT code, desc, ExpireDate FROM material UNION SELECT '0', '1', NULL; 
SELECT code, desc FROM material_view WHERE ExpireDate = '2010/07/23' OR code = '0'; 
+0

Je ne veux pas utiliser les vues. – mkus

+6

Pas besoin de '-1'-ing la réponse ... Vous n'avez pas mentionné d'évitement de vue dans votre question. – pascal

+1

Donc, ajoutez une nouvelle ligne aux matériaux avec une date vide (et d'autres champs) et le code '0' et utilisez: SELECT code, desc FROM matériel OERE ExpireDate = '2010/07/23' OU code = '0'; – too

0

Puisque vous ne voulez pas utiliser un syndicat ou une vue, je vous suggère d'ajouter un mannequin ligne à la table des matières (. avec le code = 0, desc = 1, et ExpireDate quelque chose qui ne serait jamais normalement choisi - par exemple 01 Janvier 1900) - puis utilisez une requête comme suit:

select code, desc 
from material 
where material.ExpireDate ='2010/07/23' or 
    material.ExpireDate ='1900/01/01' 

normalement, un Union serait m y option préférée.

1
WITH material AS 
(
SELECT * 
FROM 
     (VALUES (2, 'x', '2010/07/23'), 
       (3, 'y', '2009/01/01'), 
       (4, 'z', '2010/07/23')) vals (code, [desc], ExpireDate) 
) 

SELECT 
    COALESCE(m.code,x.code) AS code, 
    COALESCE(m.[desc],x.[desc]) AS [desc] 
FROM material m 
FULL OUTER JOIN (SELECT 0 AS code, '1' AS [desc]) x ON 1=0 
WHERE m.code IS NULL OR m.ExpireDate ='2010/07/23' 

Donne

code  desc 
----------- ---- 
2   x 
4   z 
0   1 
+0

Vous pouvez remplacer "UNION ALL" par des constructeurs de lignes, par ex. «.. (VALEURS (2, 'x', '2010/07/23'), (3, 'y', '2010/07/23'), (4, 'z', '2010/07/23 ')) AS matériel (code, [desc], ExpireDate) ... ' – onedaywhen

+0

@onedaywhen - Oui, je l'ai fait. Bonne suggestion merci! –

Questions connexes