SQL查询疑问:JOIN写法正常,旧式连接写法为何报错?
问题原因分析
核心问题出在表别名的使用规则上:
第一个查询中,你没有给
item表定义别名,全程用原表名item来引用列,SQL可以正常识别到对应的表,所以查询能正常运行。第二个查询里,你在
FROM子句中给item表指定了别名i(item i)、给repair表指定了别名r(repair r)。此时SQL会将别名作为该表的唯一有效引用名称,原表名item不再被系统识别为对应表的标识。你后续的SELECT和GROUP BY子句里依然用item.brand这种原表名的写法,SQL无法将这个"多部分标识符"绑定到对应的表,因此抛出了Msg 4104错误。
另外补充两个细节:
- 第二个查询里的
where brand = 'sony'其实存在隐患,虽然当前两张表没有重名的brand列,但最好加上表别名(比如i.brand = 'sony'),避免后续表结构变更后出现列名歧义。 - 旧版的
FROM 表1,表2 WHERE 关联条件写法属于隐式连接,推荐使用显式的JOIN ... ON语法,可读性和维护性更强,这也是第一个查询写法更规范的原因。
修正后的第二个查询代码:
select i.brand, i.type, i.game_or_console, count(*) as amount from item i, repair r where r.barcode = i.barcode and i.brand = 'sony' group by i.brand, i.type, i.game_or_console having count (*) >= 1
内容的提问来源于stack exchange,提问作者GUL_K
相关产品推荐
相关产品推荐

