Как "вычесть" таблицы sql?
На самом деле это не вычитание, которое я ищу. И я знаю, что это не объединение или перекресток... Мне дана длинная сложная хранимая процедура, которая возвращает таблицу активных и неактивных документов. Мне также была предоставлена аналогичная хранимая процедура, которая возвращает другую таблицу, содержащую только активные документы.
Как я могу получить таблицу неактивных документов, используя эти две процедуры хранения?
Мы используем SQL Server 2005.
Ответы
Ответ 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 условие условия для статуса документа = неактивно, вы получите только неактивный документ.