Использование когда существует в случае выписки дела - PullRequest
0 голосов
/ 14 октября 2018

Я хочу, чтобы для 'color' было установлено значение gold, если member и member_levl из tabC существуют в premium_tab.Теперь это работает, если у меня есть только 1 запись в premium_tab.Но когда у меня есть несколько записей в premium_tab, он устанавливает все их значения 'color' в null ('') независимо от того, существует элемент или нет в tabC.Не уверены в чем проблема и как это исправить?

begin for rec in premium_tab
 loop for rec1 in default_tab
  loop insert into attire_tab (outfit, outfit_val)
   values (rec1.outfit_code,
           case rec1.outfit_code when 'color' then (case when exists (select 'x' from tabC where member=rec.user and member_levl=rec.lvl)
                                                         then 'gold' else '' end)
                                 else 'other' end);
     end loop; end loop; end;

1 Ответ

0 голосов
/ 14 октября 2018

В качестве операции на основе набора:

INSERT attire_tab(outfit,outfit_val)
SELECT  
  rec1.outfit_code, 
  case 
    when rec1.outfit_code = 'color' 
      case when tabc.member is not null then 'gold' else '' end
    else 'other'
  end
FROM
  premium_tab rec 
  CROSS JOIN
  default_tab rec1
  LEFT JOIN
  tabC
  ON
    tabc.member=rec.user and tabc.member_levl=rec.levl

Несколько преимуществ этого подхода:

Тот, который вы пишете в запросе выбора (комментарий ставит строку INSERT во время разработки), который по существу воплощаетвесь блок данных, который вы хотите вставить - это легко сделать в инструменте запросов, он доступен только для чтения, его можно запускать несколько раз и тестировать, доводить до совершенства без необходимости писать код sproc, запускать sproc, выбирать из таблицы впроверить, стереть таблицу обратно в исходное состояние, изменить sproc, снова запустить sproc "

Два, что обработчик запросов базы данных свободен для оптимизации запроса, как ему нравится, вместо того, чтобы выполнять запрос в наборе шаговвынужден построчным характером кода sproc.Почти всегда лучше избегать построчных операций в пользу блоков данных.Если в rec и rec1 по тысяче строк каждая, существующий запрос может быть выполнен миллион раз.Если бы в tabc было только 100 строк, было бы быстрее выполнить объединение с существующими данными, чтобы найти крошечную долю строк, которые относятся к члену, чем миллион раз попасть в таблицу или ее индекс (тысяча повторений из тысячипоиски)

и предупредительная записка;если отношение между rec и tabc равно m: m, то левое соединение вызовет умножение строк, известное как декартово произведение.Для обработки этого случая потребуется дополнительная осторожность, потому что существующий маршрут только спрашивает, есть ли у записи какая-либо одна совпадающая строка табов, но этот маршрут объединяет их.Первоначально я считал, что конкретный премиум-ряд будет относиться только к одному члену, поэтому левое соединение безопасно для использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...