Я искал это, но не нашел ничего особенного.SQL ALL IN статья
Возможно ли иметь SQL-запрос, который будет действовать как ALL IN? Чтобы лучше объяснить, вот структура таблицы.
Orders table
OrderItem table (having several columns, but mainly ProductID, OrderID)
ProductGroup table (several columns, but mainly GroupID and ProductID)
Я хочу написать запрос, который выберет весь заказ, относящийся к определенной ProductGroup. Поэтому, если у меня есть группа с именем «XYZ» с ID = 10. В ней есть один ProductID. Say ProductID01
В комплект поставки заказа входит заказ. ProductID01 и ProductID02. Для того, чтобы найти все заказы в конкретной группе товаров можно использовать простой SQL как
SELECT bvc_OrderItem.ProductID, bvc_OrderItem.OrderID
From bvc_OrderItem
INNER JOIN bvc_Product_Group_Product with (nolock) ON bvc_OrderItem.ProductID = bvc_Product_Group_Product.ProductID
WHERE bvc_Product_Group_Product.GroupID = 10
Или я могу написать, используя в пункте
SELECT bvc_OrderItem.ProductID, bvc_OrderItem.OrderID
From bvc_OrderItem
WHERE ProductID IN (
SELECT ProductID FROM bvc_Product_Group_Product WHERE GroupID=10
)
Однако, Это возвращает все заказы, где один или несколько ProductIDs являются частью группы продуктов. Мне нужно вернуть строку заказа ТОЛЬКО, если ВСЕ элементы заказа являются частью группы продуктов
Так что, в основном, мне нужен элемент IN, который будет считаться согласованным, если ВСЕ значения внутри IN IN совпадают с строками в bvc_OrderItem.
Или, если мы используем Join, то объединение должно выполняться только в том случае, если ВСЕ строки слева имеют значения в соответствующей правой таблице.
Если бы я мог записать его более просто, я бы записать его как этот
Select ID FROM Table WHERE ID IN (1, 2, 3, 4)
и если таблица содержит все строки с идентификаторами 1,2,3,4; он должен вернуть успех. Если какой-либо из этих значений IN отсутствует, он должен возвращать значение false, и ничего не следует выбирать.
Как вы думаете, это возможно? Или есть обходное решение для этого?
Может быть, вы должны перефразировать свое состояние как " ордеров, для которых не существует строк, которые не принадлежат группе X '? – Arvo
Это звучит как [реляционное деление] (https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/) –
Я не знаю, я понимаю, что вы пытаетесь найти. Есть заказы, состоящие из одного или нескольких предметов, каждый из которых является продуктом, который существует в группе. Таким образом, ваше утверждение «Найти все заказы в конкретной группе продуктов ...» не имеет смысла. Заказы не связаны с группами продуктов. Вы имеете в виду для заказа, который состоит из продукта P, принадлежащего группе G, вы хотите видеть все остальные заказы, которые состоят только из продуктов группы G? Или вы хотите видеть все заказы, которые состоят из * любого * продукта группы G? Что вы ищете? – TommCatt