2013-07-26 4 views
-1

Начнем с того, моя структура базы данных выглядит, как показано нижеУпростить SQL запрос для получения одиночных данных

Table Application:ID(pk), App_num, App_name, App_owner, App_sec 
Table App_runner: ID(pk), app_id(FK:APP.id), runner_name 
Table Jar_used: ID(pk), runId(FK: App_runner.id),jar_name, time_stamp 
Table Jar_static: ID(pk), jar_name, current_version, version_status(either of C,S,D) 

Моя требуется ResultSet выглядит следующим образом:

App_Num, App_Name, App_Owner, Compliance 

где Compliance производный столбец на основе version_status из Jar_static таблица как 'C' = ток, 'S' = поддерживается и 'D' = устарела.

Также Результирующий набор условий:

app.id=app_runner.app_id и
app_runner.id=jar_used.runId и
jar_used.jar_name=jar_static.jar_name

После запроса отлично работает для меня:

select app.APP_NUM, app.APP_NAME ,app.APP_OWNER , case jars.version_status 
when 'C' then 'CURRENT' 
when 'S' then 'SUPPORTED' 
else 'DEPRECATED' 
end as COMPLIANCE 
from Application as app, app_runner as runner, jar_used as used, jar_static as jars 
    where app.id = runner.app_id and 
    runner.run_id = used.app_run_id and 
    jars.jar_name =used.jar_name 

Может кто-нибудь пожалуйста, предложить упрощенный путь к делать то же самое?
Также вероятным требованием является поиск записей, где jar_used.jar_name='abc' наряду с другими тремя условиями. Добавление еще одного и может дать результат, но я ищу несколько упрощенных способов. Благодарим за помощь.

+0

Некоторое идиотизм отклонил мой вопрос. Удивление !!! –

ответ

2

Ваш запрос прекрасен. Вам нужно пройти все четыре таблицы, чтобы получить необходимую информацию. Запрос не является особенно сложным.

1 примечание, однако. Вы должны изучить правильный синтаксис соединения. Это делает запросы проще читать, является более мощными, и помогает предотвратить ошибки:

select app.APP_NUM, app.APP_NAME ,app.APP_OWNER , 
     (case jars.version_status 
      when 'C' then 'CURRENT' 
      when 'S' then 'SUPPORTED' 
      else 'DEPRECATED' 
     end) as COMPLIANCE 
from Application as app join 
    app_runner as runner 
    on app.id = runner.app_id join 
    jar_used as used 
    on runner.run_id = used.app_run_id join 
    jar_static as jars 
    on jars.jar_name =used.jar_name; 

EDIT:

Правильный способ использовать этот запрос для конкретной баночки добавить where пункт:

select app.APP_NUM, app.APP_NAME ,app.APP_OWNER , 
     (case jars.version_status 
      when 'C' then 'CURRENT' 
      when 'S' then 'SUPPORTED' 
      else 'DEPRECATED' 
     end) as COMPLIANCE 
from Application as app join 
    app_runner as runner 
    on app.id = runner.app_id join 
    jar_used as used 
    on runner.run_id = used.app_run_id join 
    jar_static as jars 
    on jars.jar_name =used.jar_name 
where jar_name = 'abc' 

Если запрос кажется сложной для вас, вы можете поместить его в вид:

create view vw_application_jar as 
select app.APP_NUM, app.APP_NAME ,app.APP_OWNER , 
     (case jars.version_status 
      when 'C' then 'CURRENT' 
      when 'S' then 'SUPPORTED' 
      else 'DEPRECATED' 
     end) as COMPLIANCE, 
     jar_name 
from Application as app join 
    app_runner as runner 
    on app.id = runner.app_id join 
    jar_used as used 
    on runner.run_id = used.app_run_id join 
    jar_static as jars 
    on jars.jar_name =used.jar_name 

Тогда вы можете просто использовать:

select * 
from vw_application_jar 
where jar_name = 'abc'; 
+0

Благодарю вас за помощь. Однако можете ли вы предложить что-то на последнем условии. Есть ли другой способ, а не добавление еще одного 'и' где jar_name = 'abc'? –

+0

Ваш запрос помогает и работает так же, как мой. Спасибо. Можете ли вы предложить, как я могу получить последнюю версию ap_runner на основе runner.app_id, в том же запросе. Мое требование изменилось, чтобы получить самую последнюю запись, если есть более одной записи, основанной на последнем app_runner. Спасибо за вашу помощь. –

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