MS SQL 子查询

MS SQL subquery

我是这方面的初学者,但我尝试 select 或创建一个子查询,该子查询将 return 购买了比商品更贵的商品的客户(在 table) 购买的物品。

select statement/subquery 我创建了 returns 几乎所有在 table 中的数据 除了该项目甚至价格低于他的项目,即使我指定的价格高于商品。我的子查询似乎有什么问题?

您似乎可以使用如下所示的子查询。我假设 如果 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');

一种稍微不同的思考方式,意味着您只需显式引用每个 table 一次(它不会将它们从计划中删除):

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
);

此外,您的 table 确实应该有键和聚集索引;在当前状态下,这些查询充斥着 RID 查找。