Обновление для объединения значений и удаления одного из них с помощью SQL - PullRequest
0 голосов
/ 16 января 2019

Я использую Advantage SQL и приведенную ниже таблицу (если вы видите прикрепленные пункты 5 и 9), вы увидите, что EVID равен 90, Officer - это IQAONE на обоих, а роли - и T. Что я Для всех случаев, подобных этому в примере из реальной жизни, нужно, чтобы в поле «Роли» было -T (в любом случае в этом примере), а также удалить поле, оставленное с единственным символом роли. В долгосрочной перспективе мне нужно это посмотреть на EVID, где это то же самое, И МЕСТО то же, ОФИЦЕР - тот же ТРИДЕНТ, то же самое, и так далее.

Есть мысли?

enter image description here

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я бы создал временную таблицу с различными значениями для evid, place, employee, trident и всех других полей, которые должны быть различны:

SELECT
    MIN(item) AS "item"
  , evid
  , place
  , officer
  , trident
  , SPACE(100) AS "roles"
INTO #tmp
FROM table
GROUP BY
  , evid
  , place
  , officer
  , trident

UPDATE #tmp SET roles = '';

На следующем шаге вы должны агрегировать роли, поскольку ADS не имеет функции STRING_AGG, вы должны делать это с помощью курсоров, циклов и т. Д.

Я уже писал такой код, посмотрите здесь , например.

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

BEGIN TRANSACTION;

DELETE FROM table;
-- Assuming the table and the temp table have the same exact fields
INSERT INTO table SELECT * FROM #tmp;

END TRANSACTION;
0 голосов
/ 16 января 2019

вы можете выполнить удаление, используя условие where на основе результата для evid с более чем результатом

select from my_table 
where evid in (
  select  evid, count(*)
  from my_table  
  group by evid 
  having count(*) > 1 
) and roles = 'T'
...