2016-09-30 53 views
1

我想弄清楚如何顯示帶有「JobTitleID」列的空值的行。如何顯示空值的行?

SQL文件:

DROP TABLE Employee; 
DROP TABLE JobTitle; 


-- create our table 
CREATE TABLE JobTitle 
(
JobTitleID Number(38) PRIMARY KEY, 
JobTitle VARCHAR2(25) 
) 
; 


CREATE TABLE Employee 
(
EmployeeID Number(38) PRIMARY KEY, 
EmployeeFName VARCHAR2(25), 
EmployeeLName VARCHAR2(25), 
ClientName VARCHAR2(25), 
HoursWorked Number(5,2), 
ChargeRate Number(5,2), 
JobTitleID Number(38), 
CONSTRAINT fkJobTitle FOREIGN KEY (JobTitleID) REFERENCES JobTitle(JobTitleID) 
) 
; 



-- populate tables 

INSERT ALL 
INTO JobTitle (JobTitleID, JobTitle) VALUES (1,'Project Manager') 
INTO JobTitle (JobTitleID, JobTitle) VALUES (2,'Programmer') 
INTO JobTitle (JobTitleID, JobTitle) VALUES (3,'Network Specialist') 
INTO JobTitle (JobTitleID, JobTitle) VALUES (4,'Technical Support') 
INTO JobTitle (JobTitleID, JobTitle) VALUES (5,'Cable Installer') 
INTO JobTitle (JobTitleID, JobTitle) VALUES (6,'DBA') 
INTO JobTitle (JobTitleID, JobTitle) VALUES (7,'Telecom Engineer') 
SELECT * FROM dual; 

INSERT ALL 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (1,'Bob','Smith','Acme Corp.',125.5,72.25,1) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(2,'Bob','Smith','Astro Electric',32,72.25,1) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(3,'Jane','Doe','Acme Corp.',160,25,2) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(4,'Jane','Doe','Astro Electric.',220,25,2) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (5,'Jane','Doe','Durham Tiles',12,25,2) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (6,'Henry','Jones','Lighting Unlimited',245,15,4) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(7,'Jane','Fonda','Whale Mart',275,72.25,1) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(8,'Bill','Murray','Whale Mart',145,20,5) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(9,'Bill','Murray','ABC Logistics',45,20,5) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (10,'John','Jameson','Whale Mart',160,20,5) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (11,'John','Jameson','ABC Logistics',130,20,5) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(12,'John','Jameson','ABM Systems',8,20,5) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(13,'Homer','Simpson','Flitter',345,25,2) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(14,'John','Carpenter','Speedy Messengers',25,15,4) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (15,'John','Carpenter','Flitter',123,15,4) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (16,'John','Carpenter','ABM Systems',67,15,4) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(17,'John','Carpenter','ABC Logistics',23,15,4) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(18,'Mary','Jane','ABM Systems',43,72.25,1) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES(19,'Mary','Jane','Flitter',156,72.25,1) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (20,'Frank','Herbert','Acme Corp.',55,45,3) 
INTO Employee (EmployeeID, EmployeeFName,EmployeeLName,ClientName,HoursWorked,ChargeRate,JobTitleID) VALUES (21,'Kathy','Smith','',0,45,3) 
SELECT * FROM dual; 



COMMIT; 

到目前爲止,我有這樣的:

COLUMN Employee FORMAT a25; 
SELECT JOBTITLE.JOBTITLE AS "Job Title" 
FROM EMPLOYEE 
FULL JOIN JOBTITLE 
ON EMPLOYEE.JOBTITLEID = JOBTITLE.JOBTITLEID 
WHERE EMPLOYEE.JOBTITLEID = 0 
ORDER BY "Job Title"; /*Ordering it by alphabetical order/* 

現在我知道WHERE EMPLOYEE.JOBTITLEID = 0不會因爲表JobTitle不爲0的有效JobTitleID的工作。

,我追求的是輸出繼電器:

Job Title 
----------------------- 
DBA 
Telecom Engineer 

因爲沒有任何的「員工」的那些行的。

我目前沒有顯示任何行。

+0

所以你想要沒有僱員的職位?查找「NOT EXISTS」示例 –

+0

當然在連接條件中沒有找到對的值發現行會自動= null不是0如此使用(列爲null)而不是 – Beginner

回答

2

您可以在jobtitle表上使用left join

SELECT DISTINCT JOBTITLE.JOBTITLE AS "Job Title" 
FROM JOBTITLE 
LEFT JOIN EMPLOYEE 
ON EMPLOYEE.JOBTITLEID = JOBTITLE.JOBTITLEID 
WHERE EMPLOYEE.JOBTITLEID IS NULL 
ORDER BY "Job Title"; 

或使用not exists

select jobtitle 
from jobtitle j 
where not exists (select 1 from employee where jobtitleid = j.jobtitleid) 
order by 1 
1

你只需要改變

EMPLOYEE.JOBTITLEID = 0 

EMPLOYEE.JOBTITLEID is null 

因爲在連接條件,其 沒有發現會自動空例如

列在連接表中的值
students 
+-------------+--------------+--------- 
| id   | name   | section| 
+-------------+--------------+--------- 
|   1 | Stud 1  | 1 | 
|   2 | Stud 2  | 3 | 
+-------------+--------------+--------- 

sections 

+-------------+--------------+---- 
| id   | name | teacher | 
+-------------+--------------+---- 
|   1 | A | Teacher 1 | 
|   2 | B | Teacher 2 | 
+-------------+--------------+---- 

Select students.id, students.name, sections.name from students 
join sections on students.section = sections.id 

RESULT 

+-------------+--------------+--------- 
| id   | name   | section| 
+-------------+--------------+--------- 
|   1 | Stud 1 |  | A | 
|   2 | Stud 2 |  | null | 
+-------------+--------------+--------- 

,因爲你看到未找到結果部分中的聯接爲空

0

你只需要檢查表設計,如果你正在尋找沒有值的字段是非數字的,並允許NULL,那麼你可以使用「IS NULL「在where子句,否則,如果它的數字,你可以使用」='0'「