SQL Вставьте все записи, которые не существуют для каждого значения измерения - PullRequest
0 голосов
/ 29 мая 2018

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

ID  YearMonth

1   201805
2   201805
1   201804
1   201803

Должно быть:

ID  YearMonth

    1   201805
    2   201805
    1   201804
    1   201803
    2   201803
    2   201804

Кто-нибудь знает, как это можно сделать с помощью SQL?

Большое спасибо!

Редактировать:

Я уже пробовал:

select A."ID",B."YEARMONTH" FROM "1_TEST" A FULL OUTER JOIN 
(select "YEARMONTH" from "1_TEST" GROUP BY "YEARMONTH") B
ON A."YEARMONTH" != B."YEARMONTH"

Но это породило слишком много записей.

DB - это система HANA.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Для начала: столбец называется ID, поскольку он однозначно идентифицирует запись в таблице.Поскольку в вашей таблице есть дубликаты идентификаторов, это, очевидно, идентификаторы другой таблицы, и их следует называть так.

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

select ids.id, yearmonths.yearmonth
from (select distinct id from mytable) ids
cross join (select distinct yearmonth from mytable) yearmonths;

(Обратите внимание: я использую различные варианты выбора из вашей таблицы, потому что вы не показывали нам другие таблицы. Если есть родительская таблица, содержащая уникальные идентификаторы, тоЯ бы предпочел использовать это. То же самое для YearMonths: если есть таблица YearMonth, используйте ее вместо того, чтобы собирать различные значения из таблицы комбинации.)

Однако вы говорите, что не хотите выбиратьтолько эти, но вставьте отсутствующие записи в таблицу.

insert into mytable (id, yearmonth)
  select ids.id, yearmonths.yearmonth
  from (select distinct id from mytable) ids
  cross join (select distinct yearmonth from mytable) yearmonths
  except
  select id, yearmonth from mytable;

В HANA вы можете сократить это значение до:

upsert mytable
  select ids.id, yearmonths.yearmonth
  from (select distinct id from mytable) ids
  cross join (select distinct yearmonth from mytable) yearmonths;

Это только вставляет новые строки, потому что все выбранные столбцыявляются частью первичного ключа таблицы.

0 голосов
/ 29 мая 2018
 SELECT "ID","YEARMONTH" FROM (
 SELECT DISTINCT A."ID",B."YEARMONTH" FROM "1_TEST" A, (SELECT "YEARMONTH" FROM "1_TEST" GROUP BY "YEARMONTH") B )
 WHERE ("ID","YEARMONTH") NOT IN (SELECT "ID","YEARMONTH" FROM "1_TEST")

Обновление, лучшая версия:

 SELECT "ID","YEARMONTH" FROM (
 SELECT A."ID",B."YEARMONTH" FROM (SELECT "ID" FROM "1_TEST" GROUP BY "ID") A, (SELECT "YEARMONTH" FROM "1_TEST" GROUP BY "YEARMONTH") B )
 WHERE ("ID","YEARMONTH") NOT IN (SELECT "ID","YEARMONTH" FROM "1_TEST")
...