在连接两个表后使用NOT IN关键字

时间:2018-04-30 15:56:17

标签: sql oracle

我需要使用一个查询,该查询首先确定拥有发票的客户列表,然后使用该列表来识别那些 没有发票。我必须使用NOT IN关键字。

以下是每个表的SQL代码:

    CREATE TABLE CUSTOMER ( 
CUS_CODE        NUMBER PRIMARY KEY, 
CUS_LNAME       VARCHAR(15) NOT NULL, 
CUS_FNAME       VARCHAR(15) NOT NULL, 
CUS_INITIAL     CHAR(1), 
CUS_AREACODE CHAR(3) DEFAULT '615' NOT NULL CHECK(CUS_AREACODE IN ('615','713','931')), 
CUS_PHONE       CHAR(8) NOT NULL, 
CUS_BALANCE     NUMBER(9,2) DEFAULT 0.00, 
CONSTRAINT CUS_UI1 UNIQUE(CUS_LNAME,CUS_FNAME))

CREATE TABLE INVOICE ( 
INV_NUMBER NUMBER PRIMARY KEY, 
CUS_CODE NUMBER NOT NULL REFERENCES CUSTOMER(CUS_CODE), 
INV_DATE DATE DEFAULT SYSDATE NOT NULL, 
CONSTRAINT INV_CK1 CHECK (INV_DATE > TO_DATE('01-JAN-2012','DD-MON-YYYY')))

从客户结果中选择*:

enter image description here

从发票结果中选择*:

enter image description here

我不确定如何开始。

由于

答案给出:

enter image description here

2 个答案:

答案 0 :(得分:3)

SELECT *
FROM CUSTOMER
WHERE CUS_CODE NOT IN (SELECT CUS_CODE FROM INVOICE)

答案 1 :(得分:2)

您只需获取CUSTOMERINVOICE中没有记录的所有行:

SELECT * FROM customer c
 WHERE c.cus_code NOT IN ( SELECT i.cus_code FROM invoice i );

然而,反连接可能会更有效:

SELECT * FROM customer c
 WHERE c.cus_code NOT IN ( SELECT i.cus_code FROM invoice i
                            WHERE i.cus_code = c.cus_code );

编辑:请参阅SQL Fiddle here - 我添加了一个ORDER BY子句,以匹配上面给出的所需结果。