Как ответить на вопрос, который использует несколько таблиц без объединений? SQL - PullRequest
1 голос
/ 02 декабря 2019

Есть ли способ ответить на этот вопрос без использования объединений?

Напишите запрос, который найдет для каждого клиента X другого клиента Y, который заказал хотя бы один общий продукт с X. Найдите все такиепары покупателей (X, Y) и против каждой пары количество перекрывающихся товаров. Таким образом, запрос должен иметь три столбца. Упорядочить результаты по количеству пересекающихся продуктов.

В вопросе используется база данных https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all.

Используя объединения, я могу ответить на вопрос следующим образом:

O2.CustomerID AS Cust2,
COUNT(*) AS OverlappingProd
FROM (SELECT O.CustomerID, OD.ProductID
    FROM Orders AS O
    JOIN OrderDetails AS OD
    ON OD.orderid = o.orderid) AS O1
    JOIN(SELECT O.CustomerID, OD.ProductID
    FROM Orders AS O
    JOIN OrderDetails AS OD
    ON OD.orderid = o.orderid) AS O2
ON O2.ProductID = O1.ProductID 
AND O2.CustomerID > O1.CustomerID
GROUP BY 
O1.CustomerID,
O2.CustomerID
ORDER BY COUNT(*) DESC;

Есть ли способ ответить на него, не используя функцию JOIN? Спасибо за ваше время и внимание.

1 Ответ

0 голосов
/ 02 декабря 2019

Я не могу придумать способ сделать это без каких-либо соединений. Вы можете выразить это в SQL, используя cross join и exists, так что следующее близко:

select c1.customerid, c2.customerid,
       (select count(*)
        from products p
        where exists (select 1
                      from orderdetails od
                      where od.productid = p.productid and
                            exists (select 1
                                    from orders o
                                    where o.orderid = od.orderid and
                                          o.customerid = c1.customerid
                                   )
                     ) and
              exists (select 1
                      from orderdetails od
                      where od.productid = p.productid and
                            exists (select 1
                                    from orders o
                                    where o.orderid = od.orderid and
                                          o.customerid = c2.customerid
                                   )
                     )
        ) as num_products
from customers c1 cross join
     customers c2
where c1.customerid < c2.customerid;

Хотя этот синтаксис будет работать во многих базах данных, вложенные предложения корреляции не поддерживаются в MySQL. Таким образом, даже принимая CROSS JOIN, это не работает в MySQL.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...