2015-04-19 2 views
2

я иметь следующую структуру таблицы:Поиск MAX Колонка в Oracle SQL

Table A (A1, ...) where A1 is PK 

Table B (B1, B2, ...) where A.A1 = B.B1 and B2 is PK 

Table C (C1, C2, C3, ...) where C.C1 = B.B2 and C1 is PK 

Учитывая A.A1 и C.C2 предусмотрены, мне нужно, чтобы получить MAX() С3. Следующие, по-видимому, не работают:

select c.c3 
from A a join B b on a.A1 = b.B1 
     join C c on b.B2 = c.C1 
where a.A1 = '123' 
    and c.C2 = to_date('01-01-2000', 'mm-dd-yyyy') 
    and c.C3 = (
    select max(c3) 
    from C 
    where c1 = c.C1) 

И запрос ничего не возвращает. Однако, когда я пытаюсь:

select max(c.c3) 
from A a join B b on a.A1 = b.B1 
     join C c on b.B2 = c.C1 
group by a.A1, c.C2 
having a.A1 = '123' 
    and c.C2 = to_date('01-01-2000', 'mm-dd-yyyy') 

Кажется, что оно возвращает правильное значение, однако оно медленное. Есть ли способ заставить его работать с первым запросом (без разбиения на разделы)?

ответ

1

Вы можете попробовать WITH пункт.

Ваш запрос может быть что-то вроде этого:

;WITH C AS(
    select c.c3 
    from A a join B b on a.A1 = b.B1 
      join C c on b.B2 = c.C1 
    where a.A1 = '123' 
     and c.C2 = to_date('01-01-2000', 'mm-dd-yyyy') 
) 
SELECT MAX(C3) FROM C 

Или просто,

select max(cs) 
from (
    select c.c3 as cs 
    from A a join B b on a.A1 = b.B1 
      join C c on b.B2 = c.C1 
    where a.A1 = '123' 
     and c.C2 = to_date('01-01-2000', 'mm-dd-yyyy') 
) 
+0

Спасибо. Я добавил к вашему ответу решение с одним запросом. Мне просто интересно, почему первый запрос, который я написал, не работает. – Ulvon

1

Почему бы просто не использовать max(c3) в select?

select max(c.c3) 
from A a join 
    B b 
    on a.A1 = b.B1 join 
    C c 
    on b.B2 = c.C1 
where a.A1 = '123' and c.C2 = date '2000-01-01'; 
+0

Вы правы. Я написал свой последний запрос, как ваш. – Ulvon

Смежные вопросы