SQL, проверьте, находятся ли строки в другой таблице

У меня есть две таблицы, Warehouse и Warehouse .

Мне нужно получить Элементы, доступные во всех Складах.

Вот пример:

 Stock Table: ItemID WarehouseID ItemAmount ------------------------------------------- 1043 1 20 1043 2 2 1043 3 16 1043 4 17 1044 1 32 1044 2 12 1044 4 7 1055 2 6 

 Warehouse Table: WarehouseID WarehouseName ------------------------------- 1 Name1 2 Name2 3 Name3 4 Name4 

Для примера результатом должен быть Item 1043 потому что он доступен на всех складах, в отличие от других.

Я не добрался до решения, может ли кто-нибудь мне помочь?

 select itemid from stock group by itemid having count(distinct warehouseid) = (select count(*) from warehouse); 

SQLFiddle: http://sqlfiddle.com/#!15/e4273/1

Если таблица запасов также может содержать элементы с количеством = 0, вам нужно добавить предложение where:

 select itemid from stock where itemamount > 0 group by itemid having count(distinct warehouseid) = (select count(*) from warehouse); 

Вы также можете использовать этот «двойной отрицательный» запрос, используя NOT EXISTS :

 SELECT DISTINCT s.ItemID FROM StockTable s WHERE NOT EXISTS ( SELECT 1 FROM Warehouse w WHERE NOT EXISTS(SELECT 1 FROM StockTable s2 WHERE w.WarehouseID = s2.WarehouseID AND s.ItemID = s2.ItemID) ) 

Демо-скрипка

Этот подход выглядит более подробным, но он имеет некоторые преимущества:

  • вы можете легко его изменить, если правила становятся более сложными
  • вы можете удалить DISTINCT, чтобы увидеть все строки
  • вы можете добавить все столбцы, поскольку GROUP BY не использовался
  • он не имеет проблем с нулевыми значениями

NOT EXISTS сочетании с EXCEPT :

 select distinct ItemID from stock s1 where not exists (select warehouseid from warehouse except select warehouseid from stock s2 where s2.ItemID = s1.ItemID); 

Вы можете даже заменить select distinct ItemID на select * чтобы получить все эти элементы.

Я использую этот запрос:

 SELECT ItemID FROM stock GROUP BY ItemID HAVING SUM(DISTINCT warehouseid) = (SELECT SUM(WarehouseID) from warehouse) 

Это более надежно, чем использование COUNT , потому что в редкой ситуации, когда вы не делаете внешний ключ, он должен возвращать некоторые недопустимые результаты.

  • SQL Server 2008 Management Studio Basic и Express
  • После установки Visual Studio 2017 я не могу отлаживать SQL Server Management Studio (SSMS)
  • Подключение EF к студию управления SQL Server
  • Макрос SSMS для удаления
  • Как вставить двоичные данные в SQL-сервер с помощью SSMS
  • Функция SSMS Rank (). Как можно разделить на диапазон значений, а не точное значение?
  • SSMS 2014 - Не удалось получить данные для этого запроса - неизвестное свойство IsMemoryOptimized
  • Как я могу получить всю свою активную студию управления сайтом sql в моей базе данных в виде исполняемого журнала tsql?
  • Получить список серверов баз данных с C #
  • Просмотр схемы SQL Server Management Studio
  • создание таблицы SQL с несколькими столбцами автоматически
  • Давайте будем гением компьютера.