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 主键的一部分。
我想将某个年月还不存在的所有 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 主键的一部分。