我有两张桌子,SecuritySecurityTransactions
Security

create table security(SecurityId int, SecurityName varchar(50));

insert into security values(1,'apple');

insert into security values(2,'google');

insert into security values(3,'ibm');

SecurityTable
create table SecurityTransactions(SecurityId int, Buy_sell boolean, Quantity int);

insert into securitytransactions values ( 1 , false, 100 );

insert into securitytransactions values ( 1 , true, 20 );

insert into securitytransactions values ( 1 , false, 50 );

insert into securitytransactions values ( 2 , false, 120 );

我想知道安全名称,它在SecurityTransactions中没有出现。
答案如下:
SecurityName | Appearance
apple        | 3
google       | 1

I wrote the below sql query :

select S.SecurityName, count(t.securityID) as Appearance
from security S inner join securitytransactions t on S.SecurityId = t.SecurityId
group by t.SecurityId, S.SecurityName;

这个查询给了我想要的结果,但是仍然被一个人拒绝了,他说group by应该s.securityName。为什么会这样?
编辑:
你说哪一个是正确的,为什么?
a.按t.SecurityId、S.securityName分组
b.按t.SecurityId分组
c.按S.securityName分组

最佳答案

根据ANSI SQL,如果使用group by子句,那么选择列表只能包含group by子句中的项、其单行转换或聚合表达式。MySQL是非标准的,也允许其他列。在这种情况下,它碰巧产生了正确的答案,因为SecuirtyIdSecurityName之间存在1:1的关系,但是一般来说,这是一种不好的做法,它会使您的代码在最好的情况下难以理解,在最坏的情况下是不可预测的。
编辑:
SecuirtyIdSecurityName来处理编辑过的问题分组在技术上并没有错,它只是多余的。由于这两列之间有1:1的关系,因此将SecurityId列添加到group by子句不会更改结果,只会使阅读查询的人感到困惑。

10-08 09:33