sql 根据明细表一个字段查询主表列表,使用group,disctinct还是exists

有两个表:
A:

| id | name | ---id主键

B:

| id | a_id | item_id | item_name | desc | ----id主键,a_id 与 A中的id关联

查询-包含item_id的所有的A记录

SELECT DISTINCT A.* FROM A JOIN B ON A.id = B.a_id WHERE item_id = 123;

SELECT A.* FROM A JOIN B ON A.id = B.a_id WHERE B.item_id =123 GROUP BY A.id;

SELECT A.* FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.a_id = A.id and B.item_id = 123);

这三种查询那种最好?

阅读 3.6k
2 个回答

如果数据量很大的话第二种和第三种都不建议你用。推荐你用第一种。我们做项目的时候每次DBA审查我们的SQL只要出现子查询或者SQL用到GROUP BY都会问我们数据量大小还有表是怎么建的,都会建议我们不用GROUP BY和子查询。老是说效率慢……我是菜鸟具体怎么慢我也不清楚

建议采用第3种,从语义上最符合你的要求,效率上也应该是最高的。
第1种写法,采用表链接的方式,如果表A和表B是一对多的关系,扫描B的记录会超出需要(需求是找到一条即可,使用JOIN的方式是全部找了),另外由于使用distinct,数据库内部可能需要排序操作,效率会受一定的影响。
第2种写法,不是标准的sql,group by只有一个字段,理论上SELECT中A.*这种写法是不支持的,效率应该和第一种差不多。
第3种写法,exists语句会被数据库优化为半连接(oracle中是这样的,mysql需要自己看执行计划合适),因此效率上是最高的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题