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 查找。
我是这方面的初学者,但我尝试 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 查找。