2014-11-04 4 views
1

Я знаю, что это довольно просто, но я новичок sql и не имею понятия, как написать этот запрос. У меня 3 таблицы: рекон, потоки и заметки.Объединение 3 таблиц в sql oracle

Рекон:

no sex 
a  F 
b  F 
c  M 
d  F 
e  M 

потоки:

no notes_no 
a PX 
a SX 
a  
a DX 
b MX 
b CX 
c  
c PX 
d LX 
d WX 

примечания:

notes_no no 
AX  a 
BX  f 
CX  g 
DX  a 
EX  c 
FX  c 
GX  g 
HX  b 
PX  a 
SX  a 

Я хочу, чтобы перечислить все записи из примечаний, которые не являются частью потоков и только для клиентов из rekon, которые являются женщинами. Таким образом, результат должен быть

no sex notes_no 
a F  AX 
b F  HX 

Я попытался с помощью заявления

notes.notes_no not in (select distinct notes_no from flows) 

, но я должен много строк и оракулом имеют проблемы вычисления.

Заранее спасибо.

+0

Так где реальная вероят. является?? –

ответ

0

Попробуйте этот запрос:

SELECT notes.* FROM notes 
INNER JOIN rekon ON rekon.no = notes.no 
LEFT JOIN flows ON flows.no = notes.no 
WHERE flows.no IS NULL and sex = 'F' 
0
select N.* 
from rekon R 
    join notes N 
     on N.no = R.no 
where R.sex = 'F' 
    and not exists (
     select 1 
     from flows F 
     where F.notes_no = N.notes_no 
    ) 
; 

Запрос может быть немного отличаться в зависимости от определений ваших между столом ссылочных отношений, поэтому exists предикат может также начитан

and not exists (
     select 1 
     from flows F 
     where F.no = N.no 
      and F.notes_no = N.notes_no 
    ) 

Если Oracle имеет проблемы запрашивая данные в разумное время, то вы могли бы

  1. недоставать статистики, вычисленных на ваших столах (... так что Oracle выбирает неправильный план выполнения)
  2. быть с плохо организованной таблицей (... так что Oracle делает ненужное количество бесполезной работы)
  3. быть имеющей плохо настроенным сервером Oracle (... так что изо все силы во время хэша-соединения)
  4. быть с слишком медленным сервером marchine
Смежные вопросы