我对该查询的分组有问题

时间:2019-06-17 16:20:15

标签: sql database oracle

我在对4个联接表进行分组时遇到问题。

由于新的政府法规,每辆私人服务车辆都必须定期维修并接受适当的培训,RideWiki必须向政府报告,并证明每位驾驶员都有必要的文件才能成为私人服务驾驶员。 / p>

列出最近两个月(2019年4月16日之后)为汽车提供服务的驾驶员 并且已经完成了基本的驾驶员培训。

汽车服务>>驾驶员<

 select Dname
 from driver,carservice,dsession,training;
 where driver.dnric = carservice.dnric
 and driver.dnric = dsession.dnric
 and dsession.tid = training.tid
 where sysdate-servicedate < 60
 group by dnric,tid,dname;

CREATE TABLE DRIVER
(
DNRIC             CHAR(12) PRIMARY KEY,
DGrade            CHAR(1),
DLicense          NUMBER(8),
DStart            DATE,
DIPlan            CHAR(1),
DName    VARCHAR(20),
DDOB    DATE,
DGENDER    CHAR(1),
DMOBILE    NUMBER(11)
);

CREATE TABLE CARSERVICE
(
DCarID                 NUMBER(6) PRIMARY KEY,
CarType               VARCHAR(20),
ServRem            VARCHAR(250),
DNRIC        CHAR(12),
CarServ              CHAR(1),  
FOREIGN KEY (DNRIC) references DRIVER(DNRIC)
);

CREATE TABLE DSESSION
(
SID               NUMBER(7) PRIMARY KEY,
SDate        DATE,
DNRIC    CHAR(12),
TID            NUMBER(6),
FOREIGN KEY (DNRIC) references DRIVER(DNRIC),
FOREIGN KEY (TID) references TRAINING(TID)
);

CREATE TABLE TRAINING
(
TID     NUMBER(6) PRIMARY KEY,
TrainingPrg        VARCHAR(50),
PrgSession         VARCHAR2(10)
);

3 个答案:

答案 0 :(得分:0)

from行的末尾您输入了错误的分号。

此外,您尚未使用聚合函数,因此不应使用group by

如果不需要重复值,请使用distinct

select distinct Dname
from driver
INNER JOIN carservice ON driver.dnric = carservice.dnric
INNER JOIN dsession ON driver.dnric = dsession.dnric 
INNER JOIN training ON dsession.tid = training.tid 
Where sysdate-servicedate < 60

您应该使用显式联接语法,并避免使用基于where子句的旧的(自1992年以来)隐式联接语法。

答案 1 :(得分:0)

在创建表时,您在servicedate中引用了错误的列名,其中您提到了sdate

SELECT DISTINCT Dname
FROM driver d
INNER JOIN carservice car ON d.dnric = car.dnric
INNER JOIN dsession dses ON d.dnric = dses.dnric 
INNER JOIN training train ON dses.tid = train.tid 
WHERE sysdate-dses.sdate < 60

要记住的一些好的做法:

  1. 使用您选择的表别名dcardsestrain访问数据。
  2. 使用ANSI语法(JOIN语句)而不是备用语法来提高代码的可读性。
  3. 不要错过任何语法错误来掩盖自己的路。

此外,如果使用ORACLE / SQL Server / MS Access,则应正确提及约束变量

 CONSTRAINT FK_DNRIC FOREIGN KEY (DNRIC) references DRIVER(DNRIC),

希望这会有所帮助。

答案 2 :(得分:0)

谢谢很多家伙!在使用INNER JOIN进行查询时,我得到了很多帮助。