【问题标题】:MS SQL subqueryMS SQL 子查询
【发布时间】:2021-12-01 00:49:24
【问题描述】:

我是这方面的初学者,但我尝试选择或创建一个子查询,该查询将返回购买的商品比(表中)购买的商品更贵的商品的客户。

我创建的选择语句/子查询返回表中除了项目之外的所有数据,即使价格低于他的项目,即使我指定的价格高于项目。我的子查询中似乎有什么问题?

【问题讨论】:

  • 关于设计的旁注:如果您希望某人能够在订单中购买超过一件商品(人们在现实世界中经常这样做),我建议您设计多对多关系)。
  • 这可能是我第一次看到有人故意使用> ALL (...),而不仅仅是作为一些关于晦涩 SQL 语法的琐事问题的一部分。

标签: sql sql-server subquery database-indexes


【解决方案1】:

似乎您可以使用如下子查询。我假设如果 Badang 购买了多件商品,您会希望购买的金额高于其最高价值:

SELECT C.Cust_Name,
       I.ItemName,
       I.Price
FROM dbo.Customers C
     JOIN dbo.Orders O ON  C.CustomerID = O.CustomerID
     JOIN dbo.Items I ON O.ItemID = I.ItemID
WHERE I.Price > (SELECT MAX(Isq.Price)
                 FROM dbo.Customers Csq
                      JOIN dbo.Orders Osq ON Csq.CustomerID = Osq.CustomerID
                      JOIN dbo.Items Isq ON Osq.ItemID = Isq.ItemID
                 WHERE Csq.Cust_Name = 'Badang');

【讨论】:

    【解决方案2】:

    考虑它的方式略有不同,这意味着您只需明确引用每个表一次(它不会将它们从计划中删除):

    DECLARE @cust_name varchar(50) = 'Badang';
    
    ;WITH x AS 
    (
      SELECT c.Cust_Name,
             i.ItemName,
             i.Price,
             max_price = MAX(CASE WHEN Cust_Name = @cust_name THEN i.Price END)
                         OVER (PARTITION BY c.CustomerID)
      FROM dbo.Customers    AS c
      INNER JOIN dbo.Orders AS o ON c.CustomerID = o.CustomerID
      INNER JOIN dbo.Items  AS i ON o.ItemID = i.ItemID
    )
    SELECT Cust_Name, ItemName, Price FROM x WHERE Price > 
    (
      SELECT max_price FROM x WHERE Cust_Name = @cust_name
    );
    

    你的表也应该有键和聚集索引;在当前状态下,这些查询充满了 RID 查找。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多