我希望创建一个select语句。我的问题是我不知道从哪里开始。我希望从Field表中连接名字和姓氏。然后我想从Project表中获取项目编号和项目名称。关系是(领域1:N工作N:1项目)。我不知道如何在中间与Work表进行连接。
CREATE TABLE project (
proNumber SMALLINT not null ,
proName VARCHAR(25),
proLocation VARCHAR(25) NULL,
proDeptNumber SMALLINT,
constraint pkProj primary key(proNumber)
);
CREATE TABLE Field (
SSN CHAR(9) ,
LastName VARCHAR(25),
FirstName VARCHAR(25),
MiddleName VARCHAR(25) NULL,
Address VARCHAR(50) NULL,
City VARCHAR(25) NULL,
State CHAR(2) NULL,
Zip CHAR(9) NULL,
DateOfBirth DATETIME NULL,
Salary FLOAT(8,2) not null,
ParkingSpace INT,
Gender CHAR(1) NULL,
DptNumber SMALLINT,
SuperID CHAR(9),
constraint pkField PRIMARY KEY(ssn)
);
CREATE Work (
workEmpSSN CHAR(9) not null,
workProNumber SMALLINT not null,
workHours DECIMAL(5,1) NULL,
workHoursPlanned DECIMAL(5,1) NULL,
constraint pkAssign PRIMARY KEY (workEmpSSN, workProNumber)
);
答案 0 :(得分:2)
下次,您应该提供更多信息,例如最小架构。 我想它看起来像这样:
CREATE TABLE field ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(10), last_name VARCHAR(10) ); INSERT INTO field (first_name, last_name) VALUES ('fn1', 'ln1'), ('fn2', 'ln2'); CREATE TABLE project ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(10), work_id INT ); INSERT INTO project (name, work_id) VALUES ('P1', 1), ('P2', 1), ('P3', 3), ('P4', 2), ('P5', 1); CREATE TABLE work ( project_id INT, field_id INT, FOREIGN KEY (project_id) REFERENCES project(id), FOREIGN KEY (field_id) REFERENCES field(id) ); INSERT INTO work (project_id, field_id) VALUES (1, 1), (1, 2), (2, 1), (3, 1), (3, 2);
您可以简单地使用两个JOIN
,如下所示:
SELECT CONCAT(field.first_name, ' ', field.last_name) AS field_name, project.name AS project_name, project.id AS project_number FROM work JOIN field ON field.id = work.field_id JOIN project ON project.id = work.project_id ORDER BY project_number;
CONCAT
来连接查询中的两个字段(以获取另一个字段,我称之为field_name
)。JOIN
及其各自的ON
条款。编辑:完全误解了原来的问题,对不起。 This应该没问题!
答案 1 :(得分:0)
即使您没有直接从该表中返回任何值,您也必须在查询中包含“中间的表”:
SELECT f.FirstName, f.LastName, p.proNumber, p.proName
FROM Field AS f
JOIN Work AS w ON f.SSN = w.workSSN
JOIN Project AS p ON p.proNumber = w.workProNumber
另请注意,在现代世界中,它非常(非常,非常, 非常 )将SSN用作数据库中的主键或外键列的坏主意。您应该使用某种ID列(EmployeeID)。如果您必须存储SSN,则应对其进行加密,并且应严格限制那些需要了解的人员。将SNN以加密形式存储在一个单独的表中(相应的EmployeeID为PK)并严格限制访问,这是一个好主意,