我正在做一些家庭作业问题,对于如何在查询中使用COUNT和MAX感到有些困惑。我想知道是否有人可以向我解释这些内容的“哪里”部分,或者我只是在编写完全错误的代码:
目录关系列出了供应商为零件收取的价格。 Catalog.pid是Parts.pid的外键。 Catalog.sid是Suppliers.sid的外键。用SQL编写以下查询。执行它们以确保获得正确的答案。复制SQL查询,并将结果的屏幕截图作为答案。不要列出未在返回结果中指定的其他属性。
目录包含:pid,sid,cost
零件包含:pid,pname,颜色
供应商包含:sid,sname,地址
c。 (2分)返回唯一零件的数量。
public static void solution(String A) {
char[] a = A.toCharArray();
for(int i = 0; i < a.length; i++) {
for(int j = i + 1; j < a.length; j++) {
if(a[i] < a[j]) {
a[j] = a[i];
}
}
}
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void main(String args[]) {
String A = "ab";
solution(A);
}
-这会在选择时产生编译错误,有人对此有意见吗?
i。 (1分)在所有供应商中找到该零件的pids,pname和最高成本。
select count (distinct *) from Parts;
我不能完全确定我是否正确启动了该工具,并且我不知道在做“哪里”部分时要考虑什么。是否总是需要它?
答案 0 :(得分:1)
对于不同的零件ID,零件由ID标识
select count(distinct pid) from Parts;
或者如果pid是auto_increment,则可以行
select count(*) from Parts;
您不应该在where条件中使用聚合函数。例如:where max(c.cost)
在执行聚集函数之前首先评估where条件,以便where子句无法知道max()的值
如果您要过滤汇总结果,则应使用
例如having c.cost = max(c.cost)
,但是在这种情况下,您不能对select中的非聚合列使用不带分组依据的聚合函数,并得到另一种错误。
但是如果您还需要其他列,则可以使用子查询
select p.pid, p.pname, c.cost
from Parts p
inner join Catalog c on c.sid = p.pid
inner join Suppliers s on c.pid = s.sid
inner join (
select max(cost) max_cost
from Catalog
) t on t.max_cost = c.cost
答案 1 :(得分:1)
select count(distinct pid) from parts.
在上面的区别中是不必要的,因为pid可能是零件的主键。因此,上述结果应与
相同select count(pid) from parts.
第二个查询不需要与供应商联接,因为它遍及所有供应商。
select p.pid, p.name, max(c.cost)
from parts p left join catalog c
on p.pid=c.pid
group by 1, 2