webentwicklung-frage-antwort-db.com.de

Wie subtrahiere ich SQL-Tabellen?

Es ist nicht wirklich eine Subtraktion, die ich suche. Und ich weiß, dass es sich nicht um eine Vereinigung oder Kreuzung handelt ... Ich habe eine lange und komplexe gespeicherte Prozedur erhalten, die eine Tabelle mit aktiven und inaktiven Dokumenten zurückgibt. Ich habe auch eine ähnliche gespeicherte Prozedur erhalten, die eine andere Tabelle zurückgibt, die nur die aktiven Dokumente enthält.

Wie kann ich mit diesen beiden Speicherprozeduren eine Tabelle inaktiver Dokumente abrufen?

Wir verwenden SQL Server 2005.

24
swolff1978

Die gesuchte Set-Operation heißt MINUS, aber in SQL Server lautet das Schlüsselwort EXCEPT

  SELECT ... // all documents
  EXCEPT
  SELECT ... // active documents

Ich glaube, dass die EXCEPT-Set-Operation in SQL Server 2005 verfügbar wurde.

38
LBushkin

Angenommen, es gibt eindeutige IDs, die in den beiden Tabellen übereinstimmen:

select * from table_both b
where not exists (select * from table_active a where a.id = b.id)
11
Carl Manaster

Alle guten Antworten, aber ein Punkt fehlt: Der Fragesteller (OP) hat Prozeduren gespeichert ...

Sie müssen temporäre Tabellen definieren (basierend auf Ihrer Plattform), um die Daten zu laden

INSERT ...
EXEC getActive

INSERT ...
EXEC getInactive

Dann use 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

dies sollte auf fast jeder Datenbank-Engine funktionieren

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

Ich glaube, EXCEPT ist das, wonach Sie suchen. Die Syntax ist ähnlich zu UNION oder INTERSECT.

3
Dave Pirotte

Was ist deine DB Engine? 

In Oracle können Sie die Operation MINUS set verwenden.

In MS SQLServer 2005 und neuer können Sie VERWENDEN, MIT AUSNAHME VON .

2
SELECT both.*
FROM both LEFT OTUER JOIN inactives USING (whatever_id)
WHERE inactives.whatever_id IS NULL;

oder

SELECT * FROM both
EXCEPT
SELECT * FROM inactives;

Sie können dies auch mit der NOT IN-Klausel tun

Angenommen, die gespeicherten Prozeduren haben Ihnen Tabellenvariablen mit dem Namen @AllDocuments und @ActiveDocuments gegeben, und jedes Dokument verfügt über eine Bezeichnerspalte mit dem Namen DocId.

SELECT * FROM @AllDocuments 
WHERE DocId NOT IN 
    (SELECT DocId FROM @ActiveDocuments)

Passen Sie dies an Ihre Tabellen-/Spaltennamen an.

1
Ed B

Ich denke, Sie wollen in MS TSql das EXCEPT-Schlüsselwort.

query1 EXCEPT query2

Dadurch werden alle in der ersten Abfrage gefundenen Zeilen zurückgegeben, die nicht auch in der zweiten Abfrage gefunden wurden.

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'

Sie können diesen Befehl verwenden, um eine Tabelle von einer anderen zu subtrahieren.

0

Für die Subtraktion zwischen drei Tabellen habe ich folgende Abfrage verwendet:

Grundsätzlich habe ich drei Tabellen. Tabelle 1, Tabelle 2, Tabelle 3. Zuerst habe ich die Subtraktion von Tabelle 1 und Tabelle 2 und dann die Subtraktion zwischen dem Ergebnis der vorherigen Abfrage und Tabelle 3 vorgenommen. 

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

Sie können nur das erste SP verwenden, das die Aktiv- und Inaktiv-Klausel zurückgibt und In der WHERE-Klausel put-Bedingung für den Dokumentstatus = inaktiv. Sie erhalten nur ein inaktives Dokument. 

0
Aziz Altamimi