-3

我想将某个年月内尚不存在的每个 id 插入同一张表中,目标如下所示:

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

4

2 回答 2

0
 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")
于 2018-05-29T10:00:31.820 回答
0

首先:调用一列是ID因为它唯一地标识了表中的一条记录。由于您的表中有重复的 ID,这些显然是另一个表的 ID,应该这样命名。

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

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

(请注意:我使用您表中的不同选择,因为您没有向我们展示任何其他表。如果有一个包含唯一 ID 的父表,那么我宁愿使用它。对于 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;

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

于 2018-05-29T10:10:06.630 回答