¿Cómo 'restar' tablas sql?

No es realmente una resta que estoy buscando. Y sé que no es una unión o intersección … Me han dado un procedimiento almacenado largo y complejo que devuelve una tabla de documentos activos e inactivos. También me han dado un procedimiento almacenado similar que devuelve otra tabla que contiene solo los documentos activos.

¿Cómo podría get una tabla de documentos inactivos usando estos dos procedimientos de almacenamiento?

Estamos usando SQL Server 2005.

La operación de set que está buscando se llama MENOS, pero en SQL Server, la palabra key es EXCEPTO

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

Creo que la operación del set EXCEPT estuvo disponible en SQL Server 2005.

Suponiendo que hay ID únicos que se corresponden con las dos tablas:

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

Todas las buenas respuestas, pero falta un punto: el interrogador (OP) tiene procedimientos almacenados …

Debe definir tablas temporales (según su plataforma) para cargar los datos

 INSERT ... EXEC getActive INSERT ... EXEC getInactive 

Luego use EXCEPT / EXISTS / MINUS / IN / OUTER JOIN / etc …

 SELECT * FROM Table1 LEFT JOIN Table2 on Table1.id = Table2.id WHERE Table2.id IS NULL 

esto debería funcionar en casi cualquier motor de database

 select * from MyTable1 where MyTable1.Field1 not in ( select Field1 from MyTable2) 

Creo que EXCEPTO es lo que estás buscando. La syntax es similar a UNION o INTERSECT.

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

o

 SELECT * FROM both EXCEPT SELECT * FROM inactives; 

¿Cuál es tu motor de DB?

En Oracle, puede usar la operación de ajuste MINUS .

En MS SQLServer 2005 y posterior, puede usar EXCEPT .

En MS TSql, creo que quiere la palabra key EXCEPT.

 query1 EXCEPT query2 

Que devolverá todas las filas encontradas en la primera consulta que no se encuentran también en la segunda consulta.

También puedes hacer esto con la cláusula NOT IN

Por ejemplo, suponiendo que los procedimientos almacenados le han dado variables de tabla llamadas @AllDocuments y @ActiveDocuments y cada documento tiene una columna de identificador llamada DocId

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

Adapte esto según corresponda para que coincida con los nombres de su tabla / columna.

 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' 

Puedes probar este tipo de command para restar una tabla de otra.

Para hacer la resta entre tres tablas he usado la siguiente consulta:

Básicamente tengo tres tablas … tabla 1, tabla 2, tabla 3. Primero hice la resta de la tabla 1 y la tabla 2 y luego hice la resta entre el resultado de la consulta previa y la tabla 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) 

Puede simplemente usar la primera sp que devuelve Active & Inactive y en donde la condición de poner cluse para el estado del documento = inactivo, solo obtendrá el documento inactivo.