SQL Запрос к go через список записей и вставка отсутствующих - PullRequest
0 голосов
/ 09 января 2020

У меня есть такая таблица.

enter image description here

Вы можете видеть, что RECORD_ID имеет несколько записей, но с разными REC_STRING. REC_STRING = LMT3 пропущено для RECORD_ID = 2222.

Я хочу идентифицировать различный RECORD_IDs, который не имеет REC_STRING = LMT3. После идентификации мне нужно вставить его в пропущенный RECORD_ID.

Пример. Сценарий должен выполнить ниже.

  1. Определить, что record_id = 2222 отсутствует record_string = LMT3
  2. Затем сценарий должен вставить значения 2222 и LMT3 в таблицу.

Пожалуйста, помогите, если у кого-то есть эффективный способ. Заранее спасибо.

Ответы [ 6 ]

1 голос
/ 09 января 2020
WITH 
rec_strings AS ( SELECT DISTINCT rec_string
                 FROM sourcetable ),
record_ids  AS ( SELECT DISTINCT record_id
                 FROM sourcetable )
INSERT INTO sourcetable (rec_string, record_ids)
SELECT rec_string, record_ids
FROM rec_strings, record_ids
MINUS
SELECT rec_string, record_ids
FROM sourcetable
1 голос
/ 09 января 2020

Тестовый скрипт даст вам строки, которые будут вставлены

select distinct RECORD_ID, 'LMT3'  from table a where not exists (select 1 from table b where a.RECORD_ID = b.RECORD_ID  and b.REC_STRING = 'LMT3')

Вставить скрипт вставит их:

Insert into table(RECORD_ID, REC_STRING )
select distinct RECORD_ID, 'LMT3'  from table a where not exists (select 1 from table b where a.RECORD_ID = b.RECORD_ID  and b.REC_STRING = 'LMT3')
0 голосов
/ 09 января 2020

Пожалуйста, под запросом с результатами, вы также можете достичь этого, используя l oop ..

With CTE AS
(SELECT record_id,'LMT1' from dbo.records
Where record_id not in (Select distinct record_id from dbo.records WHERE rec_string='LMT1')
Union All
SELECT record_id,'LMT2' from dbo.records
Where record_id not in (Select distinct record_id from dbo.records WHERE rec_string='LMT2')
Union All
SELECT record_id,'LMT3' from dbo.records
Where record_id not in (Select distinct record_id from dbo.records WHERE rec_string='LMT3'
 )
 Insert into your_table (record_id,rec_string)
 Select * FROM CTE

Результаты :: Пожалуйста, проверьте также ссылку на скрипку

enter image description here

0 голосов
/ 09 января 2020

Влево присоедините декартово произведение различных значений столбцов RECORD_ID и REC_STRING к таблице и вставьте несовпадающие строки:

INSERT INTO tablename ("RECORD_ID", "REC_STRING")
SELECT c."RECORD_ID", c."REC_STRING" 
FROM (
    SELECT t1."RECORD_ID", t2."REC_STRING"
    FROM (SELECT DISTINCT "RECORD_ID" FROM tablename) t1
    CROSS JOIN (SELECT DISTINCT "REC_STRING" FROM tablename) t2
) c LEFT JOIN tablename t
ON t."RECORD_ID" = c."RECORD_ID" AND t."REC_STRING" = c."REC_STRING" 
WHERE t."RECORD_ID" IS NULL

См. Демонстрационную версию , Результаты:

> RECORD_ID | REC_STRING
> --------: | :---------
>      1111 | LMT1      
>      1111 | LMT2      
>      1111 | LMT3      
>      2222 | LMT1      
>      2222 | LMT2      
>      2222 | LMT3
0 голосов
/ 09 января 2020

Я не могу обещать, что это эффективно, но вы могли бы определить все возможные значения для каждого поля, перекрестно соединить их, а затем идентифицировать (и вставить) пропущенные значения:

insert into foo
with all_records as (
  select distinct record_id from foo
),
all_strings as (
  select distinct rec_string from foo
),
all_combo as (
  select record_id, rec_string
  from all_records, all_strings
)
select *
from all_combo a
where not exists (
  select null
  from foo f
  where
    a.record_id = f.record_id and
    a.rec_string = f.rec_string
)

Если этот подход дает значения, которые вам не нужны, вы всегда можете просто добавить предложение "where", чтобы ограничить несоответствующие значения.

0 голосов
/ 09 января 2020

Для поиска пропущенных записей вам понадобится что-то вроде следующего:

select a.RECORD_ID, 'LMT3'
from your_table a
left join (select RECORD_ID from your_table a where REC_STRING = 'LMT3') b on a.RECORD_ID = b.RECORD_ID
where b.RECORD_ID is null
group by a.RECORD_ID;

Для вставки в таблицу это будет зависеть от того, является ли она повторяющейся или одноразовой

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