Сегодня субботний вечер, так что это, вероятно, не самый элегантный, но вот одна попытка:
DECLARE @OrderProducts TABLE(OrderID INT, ProductID INT);
DECLARE @Products TABLE(ProductID INT, ProductName VARCHAR(32));
INSERT @Products VALUES
(1,'Widget 1'),(2,'Widget 2'),
(3,'Widget 3'),(4,'Widget 4'),
(5,'Widget 5'),(6,'Widget 6');
INSERT @OrderProducts VALUES
(1,1),(1,2),(2,1),(2,2),(2,3),
(2,4),(3,1),(3,5),(4,1),(5,1);
SELECT p.ProductID, p.ProductName
FROM @Products AS p
WHERE EXISTS -- had been ordered at least once
(
SELECT 1 FROM @OrderProducts
WHERE ProductID = p.ProductID
)
AND EXISTS -- at least one order does NOT include it
(
SELECT 1 FROM @OrderProducts AS o
WHERE NOT EXISTS
(
SELECT 1 FROM @OrderProducts AS o2
WHERE o2.OrderID = o.OrderID
AND o2.ProductID = p.ProductID
)
);