当前位置: 首页 > 知识库问答 >
问题:

如何回答一个使用多个没有联接的表的问题?SQL

金阳曜
2023-03-14

有没有一种方法可以不使用联接来回答这个问题?

编写一个查询,为每个客户X找到至少订购了一种与X共同产品的另一个客户Y。找到所有这样的客户对(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;

有没有办法不使用连接函数来解决这个问题?谢谢你的时间和考虑。

共有1个答案

凤衡
2023-03-14

我想不出一种没有任何连接的方法来完成这件事。您可以使用交叉连接exists在SQL中表达这一点,因此下面的内容非常接近:

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中不支持嵌套的相关子句。因此,即使接受交叉连接,这在MySQL中也不起作用。

join似乎有必要的原因是要在结果集中获得两个独立的客户ID。

 类似资料:
  • 问题内容: 我有4个不同的表要加入。这些表的结构如下: 从表A开始,我了解如何使用b联接表a和c,因为b具有这些表的主键。我也希望能够在TableA上加入表TableD。下面是我的SQL语句,该语句首先连接表A和B,然后将其连接到C: 当我尝试添加另一个联接以包括D时,出现“ TableD”未知的错误: 问题答案: 您想要更多类似这样的东西: 在您的示例中,您实际上并未包含。您要做的就是像以前一样

  • 问题内容: 所以我有四个桌子。每个表都有一个与前一个表ID相同的ID。因此,我的点击表中有一个ID和一个广告来源的ID。在广告表中,它有一个广告ID和一个来自其广告系列的ID。所以这是一个例子。 因此,要找出表4中的值从何而来,我需要遍历每个表并检查它们具有哪个ID。基本上,我想知道表1中的哪些值与表4中的值相关联。 表4中的内容是网站的访问者,表1中的内容是互联网广告。我想知道哪些访客来自哪些广

  • 我有这个存储过程。我的问题是当记录不存在于机构表是不返回任何东西。我想说即使没有记录在机构仍然返回,所以我已经添加了左外JOIN机构和_Agency=IsNull(U._Agency,")在顶部。但仍然不返回值。它是返回值时,我采取A._IsActive=1在最后一行出来。我该怎么办id A._IsActive没有值仍然返回。我尝试了相同的ISNull但不工作。

  • 我试图连接4个表,其中一个表没有所有匹配的ID,但我仍然需要显示连接的结果,甚至对于没有相应ID的行。 下面是我所说的一个例子: 示例查询: 所以基本上我要做的是,如果tbl4没有tbl1_id,我仍然希望看到来自table1的结果,但为cnt显示0值...当我运行这个查询时,我得到了一堆重复的条目,数据看起来不正确。

  • 问题内容: 嗨,我目前有3个表格,如下所示。表之间没有通用键 表1-> linkage_Table 表2->材料表 表格3-> Color_Table 我希望得到以下结果集 我想编写一条SQL语句将表连接在一起。 链接表中带有*表示我们将从材料或颜色表中检索所有值。 我现在确实需要此解决方案。一直试图解决这个问题超过5个小时。在此先感谢您的帮助。 问题答案: 一种可能的方法: SQL小提琴 说明:

  • 写一个函数均衡器(w1,w2),它包含两个不同长度的单词w1和w2。函数应该返回重复的较小单词,直到它达到长单词的长度