sql子查询困难

时间:2012-02-17 18:48:18

标签: sql sql-server subquery

目前我正在修改我的sql。我希望在一个项目表中执行查询,我希望得到最便宜的糖果。

select min(cost)
from items
where name like '%sweets%' and seller_id
in (    
    select seller_id
    from items
    where name like '%sweets%')

以上结果,返回最便宜的价格。

问题:

我想显示糖果的名称,例如它可能是巧克力糖果或草莓糖果等。但如果我更改查询的第一行以选择名称,min(cost)会产生以下错误:

Column 'items.name' is invalid in the select list because it is not contained 
in either an aggregate function or the GROUP BY clause.

现在我正在查看MYSQL教程,但我正在使用sql server。它在教程中运行良好,但不是我的情况

6 个答案:

答案 0 :(得分:3)

您需要的是最低成本项目,然后按成本排序并选择第一行。

Select top 1 name, cost
from items
where name like '%sweets%'
order by cost desc

答案 1 :(得分:3)

这应该有用。

select *
from items
where name like '%sweets%' and cost
in (    
    select min(cost)
    from items
    where name like '%sweets%')

答案 2 :(得分:3)

您不需要子查询来执行此操作。您只需按价格订购该表:

select top 10 * 
from items 
where name like '%sweets%'
order by price asc

这将为您提供与%sweets匹配的10个最便宜的商品。

答案 3 :(得分:2)

这将为您提供最便宜行中的所有字段,而不仅仅是成本:

SELECT *
FROM items
WHERE
    name LIKE '%sweets%'
    AND cost = (SELECT MIN(cost) FROM items WHERE name LIKE '%sweets%')
BTW,后缀搜索LIKE %something将导致全表扫描(相应的性能不佳)。

答案 4 :(得分:1)

您看到的错误描述了您需要执行的操作 - 在查询中添加GROUP BY子句。另外,据我所知,你的子查询是不必要的。

试试这个:

SELECT
    i.[name],
    MIN(i.[cost])
FROM [items] i
WHERE i.name LIKE '%sweet%'
GROUP BY i.[name]

答案 5 :(得分:0)

在底部添加group by items.name