Ce n'est pas vraiment une soustraction que je cherche. Et je sais que ce n'est pas une union ou une intersection ... On m'a donné une procédure stockée longue et complexe qui renvoie une table de documents actifs et inactifs. J'ai également reçu une procédure stockée similaire qui renvoie une autre table contenant uniquement les documents actifs.
Comment obtenir un tableau des documents inactifs à l'aide de ces deux procédures de magasin?
Nous utilisons SQL Server 2005.
L'opération d'ensemble que vous recherchez s'appelle MINUS, mais dans SQL Server, le mot clé est EXCEPT.
SELECT ... // all documents
EXCEPT
SELECT ... // active documents
Je pense que l'opération EXCEPT set est devenue disponible dans SQL Server 2005.
En supposant que des identifiants uniques correspondent aux deux tables:
select * from table_both b
where not exists (select * from table_active a where a.id = b.id)
Toutes les bonnes réponses, mais il manque un point: le questionneur (OP) a des procédures stockées ...
Vous devez définir des tables temporaires (basées sur votre plate-forme) pour charger les données.
INSERT ...
EXEC getActive
INSERT ...
EXEC getInactive
Ensuite utilise EXCEPT/EXISTS/MINUS/IN/OUTER JOIN/etc ...
SELECT * FROM Table1
LEFT JOIN Table2 on Table1.id = Table2.id
WHERE Table2.id IS NULL
cela devrait fonctionner sur presque n'importe quel moteur de base de données
select * from MyTable1
where MyTable1.Field1 not in (
select Field1 from MyTable2)
Je crois que EXCEPT est ce que vous recherchez. La syntaxe est similaire à UNION ou INTERSECT.
SELECT both.*
FROM both LEFT OTUER JOIN inactives USING (whatever_id)
WHERE inactives.whatever_id IS NULL;
ou
SELECT * FROM both
EXCEPT
SELECT * FROM inactives;
Vous pouvez également le faire avec la clause NOT IN
Par exemple, en supposant que les procédures stockées vous ont fourni des variables de table appelées @AllDocuments
et @ActiveDocuments
et que chaque document possède une colonne d'identifiant appelée DocId
SELECT * FROM @AllDocuments
WHERE DocId NOT IN
(SELECT DocId FROM @ActiveDocuments)
Adaptez-le en fonction des noms de table/colonne.
Dans MS TSql, je pense que vous voulez le mot clé EXCEPT.
query1 EXCEPT query2
Ce qui renverra toutes les lignes trouvées dans la première requête qui ne le sont pas également dans la seconde requête.
SELECT roll_number FROM profile WHERE(catagory='Attest and Eat' or catagory='Live and Eat') and status='OK' EXCEPT SELECT roll_number from meal_status WHERE date='29' AND month='1'
Vous pouvez essayer ce type de commande pour soustraire une table à une autre.
Pour effectuer la soustraction entre trois tables, j'ai utilisé la requête suivante:
Fondamentalement, j'ai trois tableaux .. tableau 1, tableau 2, tableau 3. J'ai d’abord fait la soustraction des tableaux 1 et 2, puis la soustraction entre le résultat de la requête précédente et le tableau 3.
select v3.Material, ((v1.Qty-v2.Qty)-v3.Qty) as Quantity
from table1 v1, table2 v2, table3 v3
where (v1.Material=v2.Material
and v1.Material=v3.Material
and v2.Material=v3.Material)
Vous pouvez simplement utiliser le premier sp qui renvoie la condition Actif & Inactif et Dans WHERE pour le statut du document = inactif.