2014-12-03 4 views
1

У меня есть массив в SQL, содержащий все заказы и все продукты из этих заказов, и мне нужно найти все пары продуктов, которые никогда не заказывались вместе в одном порядке.Поиск всех комбинаций двух продуктов, которые никогда не были заказаны вместе

Я начал с чем-то вроде этого

SELECT a.orderid, a.productid, b.OrderID, b.ProductID from [Order Details] a cross join [Order Details] b 
except 
SELECT a.orderid, a.productid, b.OrderID, b.ProductID from [Order Details] a cross join [Order Details] b 
where a.ProductID=b.ProductID 

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

EDIT: Немного изменил запрос, пошел для разного подхода. Я все ближе, но до сих пор не знаю, как избавиться от повторений, как и абы ба

select p1.productid, p2.productid from products p1 join products p2 on p1.productid<>p2.productid 
except 
select a.productid, b.productid from [Order Details] a join [Order Details] b on a.ProductID<>b.ProductID 
where a.OrderID=b.OrderID 

ответ

0

Используйте левое соединение и фильтра на пропущенном присоединяется:

select p1.productid, p2.productid 
from products p1 
join products p2 on p1.productid < p2.productid 
left join [Order Details] o1 on o1.productid = p1.productid 
left join [Order Details] o2 on o2.productid = p2.productid 
    and o2.OrderID = o1.OrderID 
where o2.OrderID is null 

Это работает, потому что пропустил присоединяется имеют все нули в строке, и пока условие соединения применяется во время соединения, применяется предложение where после соединение, поэтому указание, что объединенный столбец (который на самом деле не может быть пустым) имеет значение null только пропущенные объединения.

Еще один небольшой, но важный момент является использование менее, а не не равна в условии объединения при вступлении в таблицу продукта для себя, что предотвращает продукты присоединения к себе, но главное предотвращает два продукта присоединения к себе дважды - что в конечном итоге означает большую эффективность (вдвое больше соединений) и не нужно использовать distinct для удаления повторяющихся комбинаций.

Смежные вопросы