Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите исправить запрос. Помогите исправить запрос. 
:(
    Опции темы
ku78
Дата 25.4.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



Здравствуйте
Помогите исправить запрос. Есть три таблицы:
p_pribor в которой содержится информация о наименование прибора.
pover в которой отображается информация о поверки прибора.
p_spisok список приборов она связывает две преведущие таблицы.
Необходимо написать запрос что бы он выводил  все приборы, а также выводил их последнее текущее состояние.

Текст запроса:

Код

SELECT 
p_pribor.nai as "Наименование", 
pover.naim as "Текущее состояние", 
pover.date_p as "Дата поверки", 
p_spisok.ID, 
p_spisok.id_p,
p_spisok.id_pov
FROM p_spisok
left join pover on p_spisok.id_pov = pover.ID   and POVER.DATE_P = 
(
select max(POVER.DATE_P)  from POVER where P_SPISOK.ID_POV = POVER.ID ) 

right join p_pribor on p_pribor.ID = p_spisok.id_p



PM MAIL   Вверх
Zloxa
Дата 25.4.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Код

SELECT 
p_pribor.nai as "Наименование", 
pover.naim as "Текущее состояние", 
pover.date_p as "Дата поверки", 
p_spisok.ID, 
p_spisok.id_p,
p_spisok.id_pov
FROM p_pribor 
left join p_spisok on p_pribor.ID = p_spisok.id_p
left join (
  select max(naim) keep (dense rank last order by DATE_P nulls first) naim
           ,max(date_p)
           ,ID
  from pover
  group by ID 
) pover
  on p_spisok.id_pov = pover.ID 




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
ku78
Дата 26.4.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



если так то возникает ошибка:
Код

SQL> SELECT 
  2  p_pribor.nai as "Наименование", 
  3  pover.naim as "Текущее состояние", 
  4  pover.date_p as "Дата поверки", 
  5  p_spisok.ID, 
  6  p_spisok.id_p,
  7  p_spisok.id_pov
  8  FROM p_pribor 
  9  left join p_spisok on p_pribor.ID = p_spisok.id_p
 10  left join (
 11    select max(naim) keep (dense rank last order by DATE_P nulls first) naim
 12             ,max(date_p)
 13             ,ID
 14    from pover
 15    group by ID 
 16  ) pover
 17    on p_spisok.id_pov = pover.ID 
 18  /
left join p_spisok on p_pribor.ID = p_spisok.id_p
                                    *
ошибка в строке 9:
ORA-02000: отсутствует ключевое слово DENSE_RANK


SQL> 


Поисни вот эту строчу плиз?
Код

left join (
 11    select max(naim) keep (dense rank last order by DATE_P nulls first) naim
 12             ,max(date_p)
 13             ,ID
 14    from pover
 15    group by ID 
 16  ) pover
 17    on p_spisok.id_pov = pover.ID 

И еше где можна прочитать про keep на русском?
PM MAIL   Вверх
ku78
Дата 26.4.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



Код

SQL> SELECT 
  2  p_pribor.nai as "Наименование", 
  3  pover.naim as "Текущее состояние", 
  4  pover.date_p as "Дата поверки", 
  5  p_spisok.ID, 
  6  p_spisok.id_p,
  7  p_spisok.id_pov
  8  FROM p_pribor 
  9  left join p_spisok on p_pribor.ID = p_spisok.id_p
 10  left join (
 11  select max(naim) keep (dense_rank last order by DATE_P nulls first) naim, max(date_p),ID from p
over group by ID 
 12  ) pover on p_spisok.id_pov = pover.ID 
 13  /
pover.date_p as "Дата поверки",
*
ошибка в строке 4:
ORA-00904: "POVER"."DATE_P": недопустимый идентификатор

в итоге получается что поле подругому называется

Добавлено @ 14:07
Вот так работает:
Код

SELECT 
p_pribor.nai as "Наименование", 
pover.naim as "Текущее состояние", 
pover.date_p as "Дата поверки", 
p_spisok.ID, 
p_spisok.id_p,
p_spisok.id_pov
FROM p_pribor 
left join p_spisok on p_pribor.ID = p_spisok.id_p
left join (
select max(naim) keep (dense_rank last order by DATE_P nulls first) naim, max(date_p)  date_p,ID from pover group by ID 
) pover on p_spisok.id_pov = pover.ID 

спасибо за помощь)
но выводит серовно не так как нужно:

Наименование         Текущее состояние    Дата пов      ID        ID_P   ID_POV
--------------------            --------------------             --------              ---      -----      ---------
амперметр                       годен                25.04.09               1            1      1
амперметр            списание                   25.04.09                      2            1      2
вольтметр
комбинированый прибо
а мне нужна что бы выводились не все состояния а одно последнее ?
И еше где можна прочитать про keep  (dense_rank ) на русском?

Это сообщение отредактировал(а) ku78 - 26.4.2009, 14:37
PM MAIL   Вверх
Zloxa
Дата 26.4.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(ku78 @  26.4.2009,  14:01 Найти цитируемый пост)
И еше где можна прочитать про keep  (dense_rank ) 

На русском не знаю, а почитать тут

Это сообщение отредактировал(а) Zloxa - 26.4.2009, 20:01


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 27.4.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Код

SELECT 
max(p_pribor.nai) as "Наименование", 
max(pover.naim) keep (dense_rank last order by DATE_P nulls first) as "Текущее состояние", 
max(pover.date_p) as "Дата поверки", 
max(p_spisok.ID) id, 
max(p_spisok.id_p) id_p,
max(p_spisok.id_pov) id_pov
FROM p_pribor 
left join p_spisok on p_pribor.ID = p_spisok.id_p
left join pover on p_spisok.id_pov = pover.ID 
group by p_pribor.id


Только вот история умалчивает, что является ключем для p_pribor и в каких отношениях p_pribor и p_spisok.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
ku78
Дата 28.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



Извените что не описал все нормальна.
 Структура таблиц такая:
Код

------------------------------------------
CREATE TABLE P_PRIBOR
(
  ID   INTEGER      NOT NULL,
  NAI  VARCHAR2(20) NOT NULL
)
\
ALTER TABLE P_PRIBOR ADD PRIMARY KEY (ID)
------------------------------------------
CREATE TABLE P_SPISOK
(
  ID      INTEGER  NOT NULL,
  ID_P    INTEGER  NOT NULL,
  ID_POV  INTEGER  NOT NULL
)
\
ALTER TABLE P_SPISOK ADD PRIMARY KEY (ID)
------------------------------------------
CREATE TABLE POVER
(
  ID      INTEGER      NOT NULL,
  NAIM    VARCHAR2(20) NOT NULL,
  DATE_P  DATE         NOT NULL
)
ALTER TABLE POVER ADD PRIMARY KEY (ID)
------------------------------------------
ALTER TABLE P_SPISOK ADD (
  FOREIGN KEY (ID_POV) 
 REFERENCES POVER (ID),
  FOREIGN KEY (ID_P) 
 REFERENCES P_PRIBOR (ID));
-----------------------------------------


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  tablici.JPG 18,57 Kb
PM MAIL   Вверх
ku78
Дата 28.4.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



Спасибо за помощь вот этот вариант вроде работает)
Код

SELECT 
max(p_pribor.nai) as "Наименование", 
max(pover.naim) keep (dense_rank last order by DATE_P nulls first) as "Текущее состояние", 
max(pover.date_p) as "Дата поверки", 
max(p_spisok.ID) id, 
max(p_spisok.id_p) id_p,
max(p_spisok.id_pov) id_pov
FROM p_pribor 
left join p_spisok on p_pribor.ID = p_spisok.id_p
left join pover on p_spisok.id_pov = pover.ID 
group by p_pribor.id


Добавлено через 6 минут и 24 секунды
Толька я так и не понял нафига нужно  keep (dense_rank...) применять, без него вроде тоже работает, выдает тоже самое что и с ним. 

Код

SELECT 
max(p_pribor.nai) as "Наименование", 
max(pover.naim)  as "Текущее состояние", --keep (dense_rank last order by DATE_P nulls first)
max(pover.date_p) as "Дата поверки", 
max(p_spisok.ID) id, 
max(p_spisok.id_p) id_p,
max(p_spisok.id_pov) id_pov
FROM p_pribor 
left join p_spisok on p_pribor.ID = p_spisok.id_p
left join pover on p_spisok.id_pov = pover.ID 
group by p_pribor.id

PM MAIL   Вверх
Zloxa
Дата 28.4.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(ku78 @  28.4.2009,  12:45 Найти цитируемый пост)
, без него вроде тоже работает, выдает тоже самое что и с ним. 

Это только кажется.
Код

SQL> with t as (select 1 ord, 1 val from dual
  2             union all select 2 ord, 4 val from dual
  3             union all select 3 ord, 2 val from dual
  4             union all select 3 ord, 3 val from dual)
  5  select
  6    max(val) keep(dense_rank last order by ord) max_keep
  7    , max(val)  max
  8    , min(val) keep(dense_rank last order by ord) min_keep
  9    , min(val) min
 10  from t
 11  ;
 
  MAX_KEEP        MAX   MIN_KEEP        MIN
---------- ---------- ---------- ----------
         3          4          2          1
 


Это сообщение отредактировал(а) Zloxa - 28.4.2009, 15:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.