我仍然是SQL的初学者,我正面临着一个问题。希望您能够帮助我。 我有一个名为Department的表,它有一个DEPARTMENT_NO属性作为主键。
CREATE TABLE DEPARTMENT(
DEPARTMENT_NO INT NOT NULL,
NAME VARCHAR(25) NOT NULL,
LOCATION CHAR(15),
PRIMARY KEY(DEPARTMENT_NO));
我有另一个名为Doctor的表,其中有一个属性DNUM作为引用DEPARTMENT_NO的外键:
CREATE TABLE DOCTOR(
DOCTOR_ID CHAR(9) NOT NULL,
DNUM INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
DOB DATE,
SPECIALTY VARCHAR(20) NOT NULL,
SALARY INT,
CITY VARCHAR(15),
STREET VARCHAR(15),
START_DATE DATE,
PRIMARY KEY(DOCTOR_ID))
FOREIGN KEY(DNUM) REFERENCES DEPARTMENT(DEPARTMENT_NO));
医生可以在一个或两个部门工作。因此,如果我在第1和第4部门工作(DNUM的值将包括1和4)。
我最初选择DNUM的数据类型为INT(与DEPARTMENT_NO数据类型相同)。但INT对于多个值并不理想。
数据类型应该是什么?或者我有什么其他解决方案,例如,我运行查询以返回在部门4工作的医生的名字。 查询应返回在部门4(仅)工作的医生和在多个部门(包括4个)工作的医生的所有姓名。
非常感谢,并且抱歉留言。
答案 0 :(得分:1)
您需要一个名为doctor_department的附加表
create table doctor_department
(doctor_id integer references doctor(doctor_id) not null,
dnum integer references department(dnum) not null
)
答案 1 :(得分:1)
您可以创建与这两个表相关的另一个表 说,
Create table Dept_Doctors(
ID int not null,
DOCTOR_ID char(9) not null,
DEPARTMENT_NO INT NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY(DEPARTMENT_NO) REFERENCES DEPARTMENT(DEPARTMENT_NO),
FOREIGN KEY(DOCTOR_ID) REFERENCES DOCTOR(DOCTOR_ID));
您可以加入3个表格并获得所需的结果。
答案 2 :(得分:1)
表示“多对多”关系的标准方式是通过“交汇点”(又名“链接”)表:
CREATE TABLE DOCTOR_DEPARTMENT (
DOCTOR_ID INT REFERENCES DOCTOR(DOCTOR_ID),
DEPARTMENT_NO INT REFERENCES DEPARTMENT (DEPARTMENT_NO),
PRIMARY KEY (DOCTOR_ID, DEPARTMENT_NO)
);
请注意{DOCTOR_ID,DEPARTMENT_NO}上的密钥,以确保同一位医生无法连接到同一个部门两次。
它还隐式地在这些字段中按顺序创建了一个复合(也称为“连接”)索引,这使得查找给定医生的部门(通过索引范围扫描)非常快速。如果您需要在相反的“方向”(对于给定部门的医生)查询,请翻转字段的顺序。如果您需要两个查询,那么您将需要两个索引(即您需要显式创建一个索引)。
如果只需要其中一个索引,请考虑添加ORGANIZATION INDEX子句。