web-dev-qa-db-fra.com

Comment puis-je "soustraire" des tables SQL?

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.

24
swolff1978

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.

38
LBushkin

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)
11
Carl Manaster

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 ...

8
gbn
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

6
Jason S
select * from MyTable1
where MyTable1.Field1 not in (
  select Field1 from MyTable2)
3
tsilb

Je crois que EXCEPT est ce que vous recherchez. La syntaxe est similaire à UNION ou INTERSECT.

3
Dave Pirotte

Quel est votre moteur de base de données? 

Dans Oracle, vous pouvez utiliser l'opération MOINS set.

Dans MS SQLServer 2005 et versions ultérieures, vous pouvez utiliser SAUF .

2
Pablo Santa Cruz
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.

1
Ed B

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.

1
Matthew Jones
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.

0
Md.Alauddin Hossain

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)
0
suvidha rane

Vous pouvez simplement utiliser le premier sp qui renvoie la condition Actif & Inactif et Dans WHERE pour le statut du document = inactif. 

0
Aziz Altamimi