Objaśnienie zapytania

0

Miałe, do wykonania takie polecenie "Które pary produktów nigdy nie pojawiły się razem? (wykorzystaj łączenie wyników zapytań)"
Pierwsza myśl była taka, ale nie działa.

 --create view w1 as
--select p1.Productid as k1, p2.ProductID as k2
--    FROM products p1 CROSS JOIN products p2

--create view w2 as
--select distinct od1.productid as k3, od2.ProductID as k4
--from [order details] od1 cross join [order details] od2	
	
--select p1.Productid as k1, p2.ProductID as k2
--FROM products p1 CROSS JOIN products p2
--except 
--select distinct od1.productid as k3, od2.ProductID as k4
--from [order details] od1 cross join [order details] od2

Poszukałem na necie i znalazłem takie rozwiązanie

--create view query45
--as
--select O.orderid, productname
--from products P join [order details] OD on P.productid = Od. productid join orders O on od.orderid = o.orderid
select distinct w1.productname, w2.productname
from query45 w1 join query45 w2 on w1.orderid = w2.orderid and w1.productname<w2.productname

select P1.productname, P2.productname
from products P1 join products P2 on p1.productname<p2.productname
except
select distinct w1.productname, w2.productname
from query45 w1 join query45 w2 on w1.orderid = w2.orderid and w1.productname<w2.productname
 

Problem jest w jaki sposób ono działa? I dlaczego wynik jest wyświetlany jako wynik 2 zapytań tj. liczbę tych par trzeba sobie zsumować?

0

to jest mniej więcej tak

weź wszystkie pary dwóch towarów (czyli iloczyn kartezjański tabeli towary z samą sobą z eliminacją dubli w postaci A, B = B, A) i wywal wszystkie te (to jest except), które są na zamówieniach (tak jak pierwsze)

0

Tutaj: tworzymy widok zawierajacy potrzebne nam orderid i productname(productid dałoby ten sam wynik tylko szybciej?).

 --create view query45
--as
--select O.orderid, productname
--from products P join [order details] OD on P.productid = Od. productid join orders O on od.orderid = o.orderid

Tutaj wyświetlamy iloczyn kartezjański?

SELECT P1.productname, P2.productname
FROM products P1 JOIN products P2 ON p1.productname<p2.productname 

Tutaj z kolei odrzucamy te które są na zamówieniach.* Pytanie jak to robimy? Dlaczego łączymy dwoma kluczami?*

 EXCEPT
SELECT DISTINCT w1.productname, w2.productname
FROM query45 w1 JOIN query45 w2 ON w1.orderid = w2.orderid AND w1.productname<w2.productname 

1 użytkowników online, w tym zalogowanych: 0, gości: 1