Создать представление с несколькими регистрами без функции

#sql #oracle #view #case #ddl

#sql #Oracle #Вид #регистр #ddl

Вопрос:

Привет, я должен создать представление с помощью oracle plsql, но я не знаю, как я могу это сделать без функции создания: я получил этот запрос Привет, я хочу создать представление, которое использует запрос :

 select unique  tv.id   , tv.homeid
case
    when ht.hometype = 'A7DF56ZEF' then 0 --HOUSE
    when ht.hometype = 'A7DF45ZEF'  then 1 -- SMALLHOUSE
end as housetype ,
case
    when tv.isfourk  is null then 0
    when tv.isfourk  is not null then 1
end as isfourk
from hometable ht
join tvtable tv on ht.idtv = tv.id
where tv.homeid = 'KLL5FD5Z6'
  

Этот запрос возвращает мне результат следующим образом

 tv.id   tv.homeid  housetype    isfourk
A7844SD KLL5FD5Z6   1               0
A7944SD KLL5FD5Z6   1               0
A8044SD KLL5FD5Z6   1               0
  

Я хочу создать представление, используя этот результат запроса. этот запрос будет в представлении.

Представление будет иметь только одну строку по tv.homeid , как этот результат выполнения представления:

 TV.homeid     STATE
KLL5FD5Z6    (0 or 1 or 2 or 3 or 4 or 5)
  

УКАЖИТЕ условие регистра

 IF ALL ROWS HAVE isfourk = 1 THEN 1
ELSE IF ALL ROWS WHERE housetype = 1 HAVE isfourk = 1 THEN 2
ELSE IF ONE OF THESE ROWS HAVE isfourk = 0 THEN 3
ELSE IF ONE OF THESE ROWS WHERE housetype = 1 HAVE isfourk = 0 THEN 4
ELSE 5
END as STATE
  

Если вы можете мне помочь, пожалуйста.

Спасибо

Комментарии:

1. Пожалуйста, отредактируйте вопрос, покажите определения таблиц, примеры данных для обеих таблиц и ожидаемый результат от представления

2. У меня есть редактирование и ожидаемый вывод

3. Как я понял, у вас есть этот запрос, но он не дает желаемого результата, и вам нужна помощь. Верно? Я бы сохранил тему просмотра в качестве второго prio.

4. Мой запрос дает мне результат, я хочу использовать этот запрос для создания представления @Sujitmohanty30 как использовался этот запрос

5. @MySqlDev788, но введенный вами запрос выдает несколько строк, но теперь на основе этого запроса вы хотите создать представление, которое должно применять логику, указанную в условии CASE, и предоставлять по одной строке на homeid . я прав?

Ответ №1:

Я обобщил запрос, как показано ниже, после разъяснений. Я использовал ваш запрос в качестве базового и, кроме того, применил case логику для построения представления.

Один совет, используйте DISTINCT вместо UNIQUE

 CREATE OR REPLACE VIEW give_a_view_name
AS
SELECT homeid
      , CASE 
          WHEN MAX(isfourk) = 1 THEN 1 --IF ALL ROWS HAVE isfourk = 1
          WHEN MAX(isfourk) = 1 AND MAX(housetype) = 1 THEN 2 --IF ALL ROWS WHERE housetype = 1 HAVE isfourk = 1 THEN 2
          WHEN MIN(isfourk) = 0 THEN 3 --IF ONE OF THESE ROWS HAVE isfourk = 0 THEN 3
          WHEN MAX(housetype) = 1 AND MIN(isfourk) = 0 THEN 4 --IF ONE OF THESE ROWS WHERE housetype = 1 HAVE isfourk = 0 THEN 4
          ELSE 5 --ELSE 5
        END AS state
  FROM (SELECT DISTINCT 
              tv.id
             ,tv.homeid
             ,CASE
               WHEN ht.hometype = 'A7DF56ZEF' THEN 0 --HOUSE
               WHEN ht.hometype = 'A7DF45ZEF' THEN 1 --SMALLHOUSE
              END AS housetype
             ,CASE 
               WHEN tv.isfourk IS NULL THEN 0
               WHEN tv.isfourk IS NOT NULL THEN 1
              END AS isfourk
          FROM   hometable ht
          JOIN   tvtable tv ON ht.idtv = tv.id
         WHERE  tv.homeid = 'KLL5FD5Z6')
GROUP BY homeid;
  

Проверьте и посмотрите, работает ли это.

Комментарии:

1. Спасибо, я думаю, что для первого случая мне нужно установить MAX (isfourk) = 1 и MIN (isfourk) = 1

2. @MySqlDev788, я думаю, что основная идея состоит в том, чтобы играть с min и max, и я сделал так, как вы упомянули логику выше, но вы все равно можете изменить соответствующим образом

3. @MySqlDev788, это решило вашу проблему или ответ бесполезен?