如果有另一个你不在中间使用的表,如何在两个表之间加入?

时间:2012-09-15 17:32:41

标签: mysql sql join

我希望创建一个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)
);

2 个答案:

答案 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;
  1. 我正在使用CONCAT来连接查询中的两个字段(以获取另一个字段,我称之为field_name)。
  2. 我使用两个JOIN及其各自的ON条款。
  3. 请参阅it live on SQLFiddle

    编辑:完全误解了原来的问题,对不起。 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)并严格限制访问,这是一个好主意,