Как использовать уникальный ключ для нескольких полей в операторе NOT IN? - PullRequest
0 голосов
/ 13 июля 2011

У меня есть уникальный ключ, который будет проходить через оператор NOT IN.Как вам это сделать?

SELECT DROPPER_ID, BEGIN_DT, END_DT 
FROM VACATION_TEST 
    WHERE DROPPER_ID and BEGIN_DT and END_DT NOT IN (
    SELECT DROPPER_ID, BEGIN_DT, END_DT 
    FROM VACATION_TEST
        MINUS 
    SELECT REPORTER_VACATION.REPORTER, REPORTER_VACATION.BEGIN_DT, REPORTER_VACATION.END_DT 
    FROM REPORTER_VACATION, DROPPER 
    WHERE DROPPER.REPORTER = REPORTER_VACATION.REPORTER AND PROJECT_CD = 'INTL' );

Ответы [ 3 ]

0 голосов
/ 13 июля 2011

Помимо NOT Exists вы также можете LEFT JOIN/ IS NULL это предполагает, что все соединяемые поля НЕ НУЛЬЫ

SELECT vt.DROPPER_ID, vt.BEGIN_DT, vt.END_DT 
FROM VACATION_TEST  vt
LEFT JOIN  (
    SELECT DROPPER_ID, BEGIN_DT, END_DT 
    FROM VACATION_TEST
        MINUS 
    SELECT REPORTER_VACATION.REPORTER, REPORTER_VACATION.BEGIN_DT, REPORTER_VACATION.END_DT 
    FROM REPORTER_VACATION, DROPPER 
    WHERE DROPPER.REPORTER = REPORTER_VACATION.REPORTER AND PROJECT_CD = 'INTL' ) ni
ON vt.DROPPER_ID = ni.DROPPER_ID 
   AND vt.BEGIN_DT =ni.BEGIN_DT
   AND vt.END_DT  = ni.END_DT
WHERE ni.DROPPER_ID is null
0 голосов
/ 13 июля 2011

В Oracle вы можете сделать что-то вроде

SELECT whatever
FROM table1
WHERE  ( col1, col2 ) NOT IN
       ( SELECT expr1, expr2
         FROM   table2
       )
/

Хотя некоторые из приведенных выше решений, вероятно, более эффективны.Я обычно избегаю IN и NOT IN с подзапросами.Но все зависит от вашей ситуации и модели данных.

0 голосов
/ 13 июля 2011

использование where not exists (select * from ... where a=.. and b=..)

...