D.G*_*vez 6 sql asp.net sql-server-2005
我正在寻求改进我使用SQL-Server 2005为ASP.NET 4.0中的小型Web应用程序编写的查询.此应用程序将允许用户按产品ID进行搜索并让它返回以下信息:
这是Products表的结构(我只包括相关列,这是一个已经在生产中的数据库,这些是非pk列)
在我放下查询之前,我到目前为止我只想说我可以通过多个查询轻松获取此信息,因此如果这是最佳实践,则忽略改进查询,但我的目标是最小化所需查询的数量获取所有需要的信息.
到目前为止我所拥有的:(注意:有一些行的价格= 0所以我忽略了那些在底部选择寻找MIN价格)
SELECT price, MAX(pDate)
FROM Products
WHERE product_id = @product_id AND
(price = (SELECT MAX(price)
FROM Products
WHERE product_id =@product_id) OR
price = (SELECT MIN(price)
FROM Products
WHERE product_id = @product_id AND price > 0))
GROUP BY price
Run Code Online (Sandbox Code Playgroud)
现在这返回2行:
我理想的是,如果可能的话,让查询返回1行,并带有上面列出的所有必需信息,因为它可以简化在ASP中显示ASP中的信息.就像我之前说的那样,如果有多个查询,那么就不需要在这里重新编写复杂的查询.
编辑
这是一些示例数据

所需的查询结果:(忽略我在excel中输入的格式)

以下是Ken Benson将要使用的查询:
SELECT TOP 1 prod.product_id,
minp.price AS minprice, minp.pDate as minlastdate,
maxp.price AS maxprice, maxp.pDate as maxlastdate,
ag.price AS averageprice
FROM products AS prod
LEFT JOIN (SELECT lmd.product_id,max(lmd.pDate) as pDate,mn.price FROM products as lmd INNER JOIN
(SELECT product_id, min(price) AS price from products WHERE price > 0 group by product_id) as mn ON lmd.product_id=mn.product_id AND lmd.price=mn.price
group by lmd.product_id,mn.price ) AS minp ON minp.product_id=prod.product_id
LEFT JOIN (SELECT lxd.product_id,max(lxd.pDate) as pDate,mx.price FROM products as lxd INNER JOIN
(SELECT product_id, max(price) AS price from products group by product_id) as mx ON lxd.product_id=mx.product_id AND lxd.price=mx.price
group by lxd.product_id,mx.price ) AS maxp ON maxp.product_id=prod.product_id
LEFT JOIN (SELECT product_id,avg(price) as price FROM products WHERE price > 0 GROUP BY product_id) AS ag ON ag.product_id=prod.product_id
WHERE prod.product_id=@product_id
Run Code Online (Sandbox Code Playgroud)
我认为你可以做一些连接回到桌子上......
Select product_id, min.price, min.pDate, max.price, max.pDate
FROM products as p
LEFT JOIN (Select Min(price), pDate, product_id FROM products GROUP BY product_id)
as min on min.product_id=p.product_id
LEFT JOIN (Select max(price), pDate, product_id FROM products GROUP BY product_id)
as max on max.product_id=p.product_id
Where p.product_id = @product_id
Run Code Online (Sandbox Code Playgroud)
第二段代码应该会产生期望的结果......
SELECT prod.product_id,
minp.price AS minprice, minp.pDate as minlastdate,
maxp.price AS maxprice, maxp.pDate as maxlastdate,
ag.price AS averageprice
FROM products AS prod
LEFT JOIN (SELECT lmd.product_id,max(lmd.pDate) as pDate,mn.price FROM products as lmd INNER JOIN
(SELECT product_id, min(price) AS price from products group by product_id) as mn ON lmd.product_id=mn.product_id
group by lmd.product_id,mn.price ) AS minp ON minp.product_id=prod.product_id
LEFT JOIN (SELECT lxd.product_id,max(lxd.pDate) as pDate,mx.price FROM products as lxd INNER JOIN
(SELECT product_id, max(price) AS price from products group by product_id) as mx ON lxd.product_id=mx.product_id
group by lxd.product_id,mx.price ) AS maxp ON maxp.product_id=prod.product_id
LEFT JOIN (SELECT product_id,avg(price) as price FROM products GROUP BY product_id) AS ag ON ag.product_id=prod.product_id
WHERE prod.product_id=1
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
是的 - 遗漏了“和”条件:
SELECT TOP 1
prod.product_id,
minp.price AS minprice, minp.pDate as minlastdate,
maxp.price AS maxprice, maxp.pDate as maxlastdate,
ag.price AS averageprice
FROM products AS prod
LEFT JOIN (SELECT lmd.product_id,max(lmd.pDate) as pDate,mn.price FROM products as lmd INNER JOIN
(SELECT product_id, min(price) AS price from products group by product_id) as mn ON lmd.product_id=mn.product_id **AND lmd.price=mn.price**
group by lmd.product_id,mn.price ) AS minp ON minp.product_id=prod.product_id
LEFT JOIN (SELECT lxd.product_id,max(lxd.pDate) as pDate,mx.price FROM products as lxd INNER JOIN
(SELECT product_id, max(price) AS price from products group by product_id) as mx ON lxd.product_id=mx.product_id AND **lxd.price=mx.price**
group by lxd.product_id,mx.price ) AS maxp ON maxp.product_id=prod.product_id
LEFT JOIN (SELECT product_id,avg(price) as price FROM products GROUP BY product_id) AS ag ON ag.product_id=prod.product_id
WHERE prod.product_id=@product_id
Run Code Online (Sandbox Code Playgroud)