带有一个或多个NOT EXISTS子句的SELECT语句

时间:2014-05-16 15:42:39

标签: sql database oracle11g sqlplus

表LP标题:

CREATE TABLE LPTitle(
    title        VARCHAR(30)     NOT NULL, /* Position title              */
    CONSTRAINT LPTitle_pkey PRIMARY KEY ( title ) );

INSERT INTO LPTitle VALUES( 'ASSISTANT' ); 
INSERT INTO LPTitle VALUES( 'ASSOC. LECTURER' ); 
INSERT INTO LPTitle VALUES( 'LECTURER' ); 
INSERT INTO LPTitle VALUES( 'SENIOR LECTURER' );
INSERT INTO LPTitle VALUES( 'ASSOC. PROFESSOR' );
INSERT INTO LPTitle VALUES( 'PROFESSOR' );

表位:

CREATE TABLE Position(
p#              NUMBER(8)       NOT NULL, /* Position number            */
ptitle          VARCHAR(30)     NOT NULL, /* Position title             */
employer    VARCHAR(100)    NOT NULL, /* Institution name           */
salary      NUMBER(9,2) NOT NULL, /* Salary         */
extras      VARCHAR(50)     , /* Extras         */
specification   LONG                , /* Specification      */
    CONSTRAINT Position_pkey PRIMARY KEY ( p# ),
    CONSTRAINT Position_fkey1 FOREIGN KEY ( ptitle )
                REFERENCES LPTitle ( title ) );

INSERT INTO Position VALUES ( 00000001, 'LECTURER', 'UNSW', 45000.00, 'computer', 'Teaching');
INSERT INTO Position VALUES ( 00000002, 'LECTURER', 'UOW', 450000.00, 'mouse pad', 'Research');
INSERT INTO Position VALUES ( 00000003, 'SENIOR LECTURER', 'UTS', 50000.00, NULL, 'A lot of hard work'  );
INSERT INTO Position VALUES ( 00000004, 'ASSOC. PROFESSOR', 'UOW', 60000.00, NULL, NULL);
INSERT INTO Position VALUES ( 00000005, 'PROFESSOR', 'UQ', 80000.00, 'chair', 'Research' );
INSERT INTO Position VALUES ( 00000006, 'PROFESSOR', 'UNSW', 80000.00, 'chair', 'Research' );
INSERT INTO Position VALUES ( 00000007, 'PROFESSOR', 'UOW', 80000.00, 'chair', 'Teaching and research');

表适用:

CREATE TABLE Applies(
a#      NUMBER(6)   NOT NULL, /* Applicant number       */
p#      NUMBER(8)   NOT NULL, /* Position number        */
appdate     DATE        NOT NULL, /* Application date       */
    CONSTRAINT Applies_pkey PRIMARY KEY ( a#, p# ), 
    CONSTRAINT Applies_fkey1 FOREIGN KEY ( a# )
                REFERENCES Applicant ( a# )
                ON DELETE CASCADE,
    CONSTRAINT Applies_fkey2 FOREIGN KEY ( p# )
                REFERENCES Position ( p# ) 
                ON DELETE CASCADE);

INSERT INTO Applies VALUES( 000001, 00000001, TO_DATE('13-DEC-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000002, 00000001, TO_DATE('13-DEC-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000003, 00000002, TO_DATE('14-NOV-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000004, 00000002, TO_DATE('20-JAN-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000005, 00000002, TO_DATE('22-JAN-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000005, 00000003, TO_DATE('09-MAY-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000006, 00000003, TO_DATE('17-JUN-1999','DD-MON-YYYY') ); 
INSERT INTO Applies VALUES( 000007, 00000003, TO_DATE('18-JUN-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000007, 00000004, TO_DATE('13-APR-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000008, 00000004, TO_DATE('13-APR-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000009, 00000004, TO_DATE('14-APR-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000010, 00000005, TO_DATE('23-SEP-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000001, 00000006, TO_DATE('26-OCT-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000002, 00000006, TO_DATE('27-OCT-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000003, 00000006, TO_DATE('28-OCT-1999','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000004, 00000007, TO_DATE('01-JAN-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000005, 00000007, TO_DATE('03-JAN-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000006, 00000007, TO_DATE('04-JAN-2000','DD-MON-YYYY') );
INSERT INTO Applies VALUES( 000007, 00000007, TO_DATE('07-JAN-2000','DD-MON-YYYY') );

通过上面的3个表,我想找到没有应用程序的所有职位的标题。如何通过使用带有一个或多个NOT EXISTS子句的SELECT语句来实现它?

这是我到目前为止的查询,结果总是"没有选择行" (这是错的):

SELECT
    LPTitle.title
FROM
    LPTitle
    FULL OUTER JOIN
    Position
ON
    LPTitle.title = Position.ptitle
WHERE
    NOT EXISTS
        (
            SELECT Applies.p# FROM Applies INNER JOIN Position ON Applies.p# = Position.p#
        )
;

1 个答案:

答案 0 :(得分:1)

我认为下面的查询将完成这项工作。请注意,您不需要LPTitle表,因为您已将所有标题值存储在Positionptitle列中。 基本上结果是一样的:你有一个申请你所有的7个职位!

SELECT
    p.ptitle
FROM
    Position p
WHERE
    NOT EXISTS
        (
            SELECT 1 FROM Applies WHERE p# = p.p#
        )
;

如果您打算查找所有未使用的标题,那么这是另一项任务:

SELECT
    l.title
FROM
    LPTitle l
WHERE
    NOT EXISTS
        (
            SELECT 1 FROM Position ptitle = l.title
        )
;
相关问题