外部联接没有给出期望的结果

时间:2014-04-23 12:37:53

标签: sql oracle join sqlplus outer-join

我有几张桌子,我想加入。以下是两个有问题的表:

CREATE TABLE BRANCH(
BranchID        Int     NOT NULL,
Street          Char(50)    NOT NULL,
City            Char(30)    NOT NULL,
Postcode        Char(10)    NOT NULL,
TelephoneNumber     Int     NOT NULL,
ManagerName     VarChar(40) NOT NULL,
CONSTRAINT      BRANCH_PK   PRIMARY KEY(BranchID)
 ); 

CREATE TABLE STAFF(
StaffID         Int     NOT NULL,
BranchID        Int     NULL,
Name            VarChar(40) NOT NULL,
Street          Char(50)    NOT NULL,
City            Char(30)    NOT NULL,
Postcode        Char(10)    NOT NULL,
Position        Char(15)    NOT NULL,
Salary          Decimal(6,2)    NOT NULL,
StartingDate        Date        NOT NULL,
CONSTRAINT      STAFF_PK    PRIMARY KEY(StaffID),
CONSTRAINT      STAFF_BRANCH_FK   FOREIGN KEY (BranchID)
                        REFERENCES BRANCH(BranchID)
);

我写了一个连接,希望它可以使用下面显示的BranchID行连接两个表:

SELECT STAFF.Name
   ,STAFF.Position
   ,BRANCH.BranchID
FROM STAFF
FULL OUTER JOIN BRANCH
    ON STAFF.BranchID = BRANCH.BranchID
ORDER BY STAFF.Name;

加入并不起作用,因为我希望它能以下列格式显示值:

NAME                                     POSITION          BRANCHID
---------------------------------------- --------------- ----------
Anna Jones                               Supervisor
Colin Stevens                            Assistant
Jack Butler                              Supervisor
John Walters                             Assistant
Mary Johnson                             Assistant
                                                               8000
                                                               6017
                                                               6016
                                                               6015
                                                               8001

问题是branchID未被分配到相关的员工姓名。有可能以某种方式这样做吗?这样,branchID就会出现在与员工姓名和职位相同的行中。任何指导都将不胜感激。

2 个答案:

答案 0 :(得分:0)

无论是否满足连接条件,FULL OUTER JOIN都会从两个表中获取行。您可以使用INNER JOIN获取信息,如下所示:

SELECT STAFF.Name
   ,STAFF.Position
   ,BRANCH.BranchID
FROM STAFF
INNER JOIN BRANCH
    ON STAFF.BranchID = BRANCH.BranchID
ORDER BY STAFF.Name;

但是,您的数据似乎也不正确。 STAFF.BranchID似乎是NULL

答案 1 :(得分:0)

FULL OUTER JOIN关键字会返回左表中的所有行(在您的情况下为STAFF)和右表(在您的情况下为BRANCH)。

您的实际结果看起来与您在BranchID上的联接没有匹配的行。

为什么你需要FULL OUTER JOIN

尝试使用以下查询来仅获取两个表中与BranchID匹配的行:

SELECT
    STAFF.Name
    ,STAFF.Position
    ,BRANCH.BranchID

FROM
    STAFF JOIN BRANCH ON STAFF.BranchID = BRANCH.BranchID

ORDER BY
    STAFF.Name