这些SQL查询是否等效(自然联接)?

时间:2018-10-16 03:56:10

标签: sql

给出这些表:

  • 参加了(执照号,车号,报告号,损坏金额)
  • 汽车(car_regnum,型号,年份)
  • 事故(报告编号,日期,位置)
 
SELECT COUNT(DISTINCT a.report_number), c.model
FROM accident as a, car as c, participated as p
GROUP BY c.model
HAVING a.report_number= p.report_number and c.car_regnum=p.car_regnum  
and a.date>= '2016-01-01'
ORDER BY DESC

并且:

SELECT COUNT(DISTINCT accident.report_number), model
FROM accident NATURAL JOIN participated NATURAL JOIN car 
WHERE date >= '2016-01-01'
GROUP BY model;
ORDER BY DESC

1 个答案:

答案 0 :(得分:0)

看起来它们执行相同的逻辑,因此应该等效。

不过,我不会考虑使用第一个-逗号连接太容易搞砸了,而且四分之一世纪以来,显式连接语法已成为标准的一部分。

第二个我很满意,但是很多人对NATURAL JOIN感到“厌恶”。如果您在一个训练有素的团队中工作,NATURAL JOIN很棒,其中每个列的名称仅代表一件事,但是在许多组织中,名称(尤其是像Description这样的通用名称)可能会被重用跨表,并且不应该成为联接条件的一部分。

因此,大多数人(据我所知)可能更喜欢以下方式:

SELECT
  model,
  COUNT(DISTINCT a.report_number)
FROM
  accident a
    INNER JOIN
  participated p
    ON
      a.report_number = p.report_number
    INNER JOIN
  car c
    ON
      p.car_regnum = c.car_regnum
WHERE
  date >= '2016-01-01'
GROUP BY
  model;