【问题标题】:When joining two tables with SQL, I get null values for two of my columns in the results使用 SQL 连接两个表时,我在结果中的两列得到空值
【发布时间】:2018-04-14 00:52:37
【问题描述】:

这些是我创建的表

CREATE TABLE PROJECT 
(
    ProjectID   Int          NOT NULL IDENTITY (1000, 100),
    ProjectName Char(50)     NOT NULL,
    Department  Char(35)     NOT NULL,
    MaxHours    Numeric(8,2) NOT NULL DEFAULT 100,
    StartDate   DateTime     NULL,
    EndDate     DateTime     NULL,

    CONSTRAINT PROJECT_PK PRIMARY KEY (ProjectID),
    CONSTRAINT PROJ_DEPART_FK FOREIGN KEY(Department)
                              REFERENCES DEPARTMENT(DepartmentName)
                                  ON UPDATE CASCADE
);

CREATE TABLE ASSIGNMENT 
(
    ProjectID      Int      NOT NULL,
    EmployeeNumber Int      NOT NULL,
    HoursWorked    Numeric(6,2) NULL,

    CONSTRAINT ASSIGNMENT_PK PRIMARY KEY (ProjectID, EmployeeNumber),
    CONSTRAINT ASSIGN_PROJ_FK FOREIGN KEY (ProjectID)
                              REFERENCES PROJECT (ProjectID)
                                  ON UPDATE NO ACTION
                                  ON DELETE CASCADE,
    CONSTRAINT ASSIGN_EMP_FK FOREIGN KEY (EmployeeNumber)
                             REFERENCES EMPLOYEE (EmployeeNumber)
                                  ON UPDATE NO ACTION
                                  ON DELETE NO ACTION
);

这是我正在运行的查询

SELECT 
    A.ProjectID, E.FirstName, E.LastName, A.HoursWorked
FROM
    ASSIGNMENT A
LEFT JOIN 
    EMPLOYEE E ON A.ProjectID = E.EmployeeNumber

这是我得到的结果

ProjectID   FirstName   LastName    HoursWorked
------------------------------------------------
1000        NULL        NULL        30.00
1000        NULL        NULL        65.00
1000        NULL        NULL        55.00
1100        NULL        NULL        40.00
1100        NULL        NULL        45.00
1200        NULL        NULL        25.00
1200        NULL        NULL        20.00
1200        NULL        NULL        45.00
1200        NULL        NULL        40.00
1300        NULL        NULL        35.00
1300        NULL        NULL        50.00
1400        NULL        NULL        15.00
1400        NULL        NULL        10.00
1400        NULL        NULL        27.50

插入的数据

/*****   PROJECT DATA   *********************************************************/

INSERT INTO PROJECT VALUES(
    '2010 Q3 Product Plan', 'Marketing', 135.00, '10-MAY-10', '15-JUN-10');
INSERT INTO PROJECT VALUES(
    '2010 Q3 Portfolio Analysis', 'Finance', 120.00, '05-JUL-10', '05-JUL-10' );
INSERT INTO PROJECT VALUES(
    '2010 Q3 Tax Preparation', 'Accounting', 145.00, '10-AUG-10', '15-OCT-10');
INSERT INTO PROJECT VALUES(
    '2010 Q4 Product Plan', 'Marketing', 150.00, '10-AUG-10', '15-SEP-10');
INSERT INTO PROJECT (ProjectName, Department, MaxHours, StartDate)              
    VALUES(                                     
    '2010 Q4 Portfolio Analysis', 'Finance', 140.00, '05-OCT-10');          

/*****   ASSIGNMENT DATA   ******************************************************/

INSERT INTO ASSIGNMENT VALUES(1000, 1, 30.0);
INSERT INTO ASSIGNMENT VALUES(1000, 8, 75.0);
INSERT INTO ASSIGNMENT VALUES(1000, 10, 55.0);
INSERT INTO ASSIGNMENT VALUES(1100, 4, 40.0);
INSERT INTO ASSIGNMENT VALUES(1100, 6, 45.0);
INSERT INTO ASSIGNMENT VALUES(1200, 1, 25.0);
INSERT INTO ASSIGNMENT VALUES(1200, 2, 20.0);
INSERT INTO ASSIGNMENT VALUES(1200, 4, 45.0);
INSERT INTO ASSIGNMENT VALUES(1200, 5, 40.0);
INSERT INTO ASSIGNMENT VALUES(1300, 1, 35.0);
INSERT INTO ASSIGNMENT VALUES(1300, 8, 80.0);
INSERT INTO ASSIGNMENT VALUES(1300, 10, 50.0);
INSERT INTO ASSIGNMENT VALUES(1400, 4, 15.0);
INSERT INTO ASSIGNMENT VALUES(1400, 5, 10.0);
INSERT INTO ASSIGNMENT VALUES(1400, 6, 27.5);

当我只针对名字和姓氏列运行查询时,所有名字都会显示出来,并且绝对不为空。我对 JOIN 语句非常缺乏经验,所以我不确定这是否正确。我尝试使用“RiGHT JOIN”,但这使得其他两列为 NULL,而不是名字和姓氏列。如何让结果显示完全没有任何 NULL 值?

【问题讨论】:

  • 你能提供一些样本数据并期待结果吗?看起来可以等于ON A.ProjectID = E.EmployeeNumber的那些表
  • 我希望 FirstName 和 lastName 列不为空。我在这些列中插入了数据。所以我希望它们不为 NULL。我不确定你要我提供什么
  • 我的意思是您可以向我们展示来自PROJECTASSIGNMENT 表的一些数据。真的很有帮助
  • 好的,我更新了

标签: sql sql-server join left-join


【解决方案1】:

您将根据项目 ID 和员工编号加入。这没有意义。

一个合理的查询应该是:

SELECT A.ProjectID, P.ProjectName, P.Department, A.HoursWorked
FROM  ASSIGNMENT A
      PROJECT P
      ON A.ProjectID = P.ProjectId;

如果您需要有关员工的信息,那么您需要一个EMPLOYEE 表。然后这样的事情会起作用:

SELECT A.ProjectID, E.FirstName, E.LastName, A.HoursWorked
FROM ASSIGNMENT A LEFT JOIN
     EMPLOYEE E 
     ON A.EmployeeNumber = E.EmployeeNumber

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2015-12-04
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多