Используйте ключевое слово NOT IN после объединения двух таблиц - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно использовать запрос, который сначала идентифицирует список клиентов, которые действительно имеют счет, а затем использует этот список для идентификации которые не имеют счета. Я должен использовать ключевое слово 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 голосов
/ 30 апреля 2018
SELECT *
FROM CUSTOMER
WHERE CUS_CODE NOT IN (SELECT CUS_CODE FROM INVOICE)
0 голосов
/ 30 апреля 2018

Вы бы просто получили все строки в CUSTOMER, где нет записи в INVOICE:

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 здесь - я добавил предложение ORDER BY, чтобы соответствовать желаемому результату, указанному выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...