Подтвердить что ты не робот

Как "вычесть" таблицы sql?

На самом деле это не вычитание, которое я ищу. И я знаю, что это не объединение или перекресток... Мне дана длинная сложная хранимая процедура, которая возвращает таблицу активных и неактивных документов. Мне также была предоставлена ​​аналогичная хранимая процедура, которая возвращает другую таблицу, содержащую только активные документы.

Как я могу получить таблицу неактивных документов, используя эти две процедуры хранения?

Мы используем SQL Server 2005.

4b9b3361

Ответ 1

Операция набора, которую вы ищете, называется MINUS, но в SQL Server ключевым словом является EXCEPT

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

Я считаю, что операция установки EXCEPT стала доступной в SQL Server 2005.

Ответ 2

Предполагая наличие уникальных идентификаторов, которые соответствуют двум таблицам:

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

Ответ 3

Все хорошие ответы, но отсутствует одна точка: у вопросника (OP) есть хранимые процедуры...

Вы должны определить временные таблицы (на основе вашей платформы) для загрузки данных

INSERT ...
EXEC getActive

INSERT ...
EXEC getInactive

Затем используйте EXCEPT/EXISTS/MINUS/IN/OUTER JOIN/etc...

Ответ 4

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

это должно работать почти с любым движком базы данных

Ответ 5

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

Ответ 6

Я считаю, что ИСКЛЮЧЕНИЕ - это то, что вы ищете. Синтаксис похож на UNION или INTERSECT.

Ответ 7

Какой у вас механизм БД?

В Oracle вы можете использовать MINUS операцию установки.

В MS SQLServer 2005 и новее вы можете использовать EXCEPT.

Ответ 8

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

или

SELECT * FROM both
EXCEPT
SELECT * FROM inactives;

Ответ 9

В MS TSql я думаю, что вам нужно ключевое слово EXCEPT.

query1 EXCEPT query2

который вернет все строки, найденные в первом запросе, которые также не найдены во втором запросе.

Ответ 10

Вы также можете сделать это с помощью предложения NOT IN

Например, если хранимые процедуры предоставили вам табличные переменные с именем @AllDocuments и @ActiveDocuments, и каждый документ имеет столбец идентификатора DocId

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

Адаптируйте его соответствующим образом, чтобы соответствовать именам таблиц/столбцов.

Ответ 11

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'

Вы можете попробовать эту команду, чтобы вычесть таблицу из другой.

Ответ 12

Для выполнения вычитания между тремя таблицами я использовал следующий запрос:

В принципе у меня есть три таблицы. Таблица 1, таблица 2, таблица 3. Во-первых, я выполнил вычитание таблицы 1 и таблицы 2, а затем выполнил вычитание между результатом предыдущего запроса и таблицы 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)

Ответ 13

Вы можете просто использовать первый sp, который возвращает Active и Inactive и в WHERE cluse условие условия для статуса документа = неактивно, вы получите только неактивный документ.