SQL 为维度的每个值插入所有不存在的记录

SQL Insert all records that don't exist for every value of dimension

我想将某个年月还不存在的所有 id 插入同一个 table,目标如下所示:

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 系统。

 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")

开头:列称为 ID,因为它唯一标识 table 中的一条记录。由于您的 table 中有重复的 ID,这些显然是另一个 table 的 ID,应该这样命名。

无论如何,您需要将在 table 中找到的所有 ID 与在 table 中找到的所有月份相结合。那将是一个交叉连接:

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

(请注意:我使用与您的 table 不同的 select,因为您没有向我们展示任何其他 table。如果有父 table 包含唯一 ID,那么我宁愿使用它。YearMonths 也是如此;如果有 YearMonth table,则使用它而不是从组合 table 中收集不同的值。)

但是,你说你不想只select这些,而是​​在table中插入缺失的记录。

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;

这只会插入新行,因为所有 selected 列都是 table 主键的一部分。