我在对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)
);
答案 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
要记住的一些好的做法:
d
,car
,dses
,train
访问数据。此外,如果使用ORACLE / SQL Server / MS Access,则应正确提及约束变量
CONSTRAINT FK_DNRIC FOREIGN KEY (DNRIC) references DRIVER(DNRIC),
希望这会有所帮助。
答案 2 :(得分:0)
谢谢很多家伙!在使用INNER JOIN进行查询时,我得到了很多帮助。