【问题标题】:How to replace a join with subquery and cte?如何用子查询和 cte 替换连接?
【发布时间】:2019-10-07 13:24:14
【问题描述】:

您好,我正在为我解决的每个问题练习多个选项。 我想将这个带有 join 的查询转换成一个带有子查询的查询和另一个带有 cte 的查询。

但是我发现这样做很难:

SELECT 
    C.CompanyName, MAX(OD.UnitPrice*OD.Quantity)MaxOdPrice, 
    MIN(OD.UNITPRICE*OD.Quantity) MinOdPrice
FROM [Order Details] OD 
JOIN Orders O       ON OD.OrderID=O.OrderID
JOIN Customers C    ON O.CustomerID=C.CustomerID
GROUP BY C.CompanyName

谢谢

【问题讨论】:

  • 好吧,您仍然需要联接...您是否尝试完全重新创建此查询而不使用 JOIN 关键字? (ansi-89 不算)
  • 我理解并感谢您尝试不同的方法,并为您想要尝试不同的事情而鼓掌。但是你想在这里做什么完全不清楚。如果您只是想练习 ctes 等,有更好的方法来学习它们,而不是仅仅对解决方案提出随机要求。
  • 您正在从不同的表中进行选择。您希望如何将JOINs 替换为子查询?

标签: sql-server subquery inner-join


【解决方案1】:

您仍然需要 JOINS,但这里有一个简单的 CTE,我希望可以提供一些关于如何进一步进行的想法

;With cteCustomers
AS(
    SELECT  X.CustomerID, X.CompanyName
    FROM    Customers X
)
SELECT 
    C.CompanyName, MAX(OD.UnitPrice*OD.Quantity)MaxOdPrice, 
    MIN(OD.UNITPRICE*OD.Quantity) MinOdPrice
FROM [Order Details]    OD 
JOIN Orders             O   ON  OD.OrderID=O.OrderID
JOIN cteCustomers       C   ON  O.CustomerID=C.CustomerID
GROUP BY C.CompanyName

【讨论】:

    【解决方案2】:

    完全未经测试,但我认为这样的事情可以在没有连接的情况下完成。

    select C.CompanyName,
       max(select MAX(UnitPrice * Quantity)
           from [Order Details]
           where OrderID in (select distinct OrderID
                             from Orders
                             where CustomerID in (select CustomerID
                                                  from Customers innerC
                                                  where innerC.CompanyName = C.CompanyName
                                                 )
                           )
           group by OrderID
          ) AS MaxOdPrice
    FROM Customers C
    GROUP BY C.CompanyName
    

    我只显示 MaxOdPrice。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 2015-02-09
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多