SQL/SAS:创建表在哪里不存在?

Posted

技术标签:

【中文标题】SQL/SAS:创建表在哪里不存在?【英文标题】:SQL / SAS: create table where not exist? 【发布时间】:2017-03-02 07:05:56 【问题描述】:

我有一张这样的桌子:

ID    GROUP VALUE
201540  1   1000
201540  2   1111
201540  5   2000
201550  1   200
201550  8   400
201610  4   990
201610  5   400
201610  6   777
201610  7   222
201610  8   6666

我需要做的是展开表,所以每个 ID 有 1 到 8 的 8 个组。 我想为每个 ID 创建一个包含缺失组的表,如下所示:

ID    GROUP VALUE
201540  3   -1
201540  4   -1
201540  6   -1
201540  7   -1
201540  8   -1
201550  2   -1
201550  3   -1
201550  4   -1
201550  5   -1
201550  6   -1
201550  7   -1
201610  1   -1
201610  2   -1
201610  3   -1

我试过了

CREATE TABLE TMP AS 
SELECT ID, GROUP, -1 from table where not exists
(SELECT * FROM table where ....)

但我不知道如何使用where-clause...

有什么提示吗? 谢谢你,dbdb

【问题讨论】:

您使用的是哪个 DBMS?后格雷斯?甲骨文? 【参考方案1】:

这是我在 Oracle 中尝试过的。逻辑是

    生成范围为 1-8。 (下) 在派生表中获取不同的 ID。 (距离) 交叉连接以上 2 个输出以获得 Group 和 ID 的所有可能组合。 使用此组合并与现有表连接并仅过滤现有表中缺少的那些记录。您可以使用left join 来完成。

这是 Oracle 中的示例代码。您可以在 SAS 中使用类似的方法。

    with tbl(ID,GRP,VAL) as (
    select 201540,1,1000 from dual union all
    select 201540,2,1111 from dual union all
    select 201540,5,2000 from dual union all
    select 201550,1,200  from dual union all
    select 201550,8,400  from dual union all
    select 201610,4,990  from dual union all
    select 201610,5,400  from dual union all
    select 201610,6,777  from dual union all
    select 201610,7,222  from dual union all
    select 201610,8,6666 from dual )
    ,seq (seqno) as (
    select 1 from dual union all
    select 2 from dual union all
    select 3 from dual union all
    select 4 from dual union all
    select 5 from dual union all
    select 6 from dual union all
    select 7 from dual union all
    select 8 from dual)
    ,all_seq as 
    (select * from seq cross join (select distinct ID from tbl))
    select s.id,s.seqno as grp,-1 as val from all_seq s
    left join tbl t 
    on s.id=t.id and s.seqno=t.grp
    where t.id is null

输出

ID      GRP VAL
201540  4   -1
201540  7   -1
201540  6   -1
201540  3   -1
201540  8   -1
201550  7   -1
201550  4   -1
201550  3   -1
201550  5   -1
201550  6   -1
201550  2   -1
201610  1   -1
201610  3   -1
201610  2   -1

【讨论】:

【参考方案2】:

如果这是在 SAS 中,那么将问题分解为如下几个步骤可能是最简单的:

    如果所有唯一 ID 都得到一个列表(如果您已经有这样的数据集,请跳过此步骤)

Proc sort data = original out = ID_list nodupkey; by ID; run;

    扩展 ID 列表数据集以包含每个 ID 的所有组。

    data expanded; set ID_list; do i = 1 to 8; group = i; value = - 1; output; end; run;

    查找原始文件中不存在的 ID*组组合。

    proc sql; create table final as select L.* from expanded as L left join original as R on L.ID=R.ID and L.group = R.group where not(L.ID = R.ID and L.group = R.group); quit;

这应该会为您提供原始数据集中不存在的所有 ID*Groups,其值为 - 1。

【讨论】:

非常感谢,是的,它在 SAS 中。你的解决方案对我有用。

以上是关于SQL/SAS:创建表在哪里不存在?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL创建临时表?

Windows DLL中的字符串表在哪里?

postgresql----temporary table和unlogged table

mySQL 从一个表中选择,该表在另一个表中不存在,并且不是第三个表中的子表

DB2数据库中的表在硬盘上的存储位置在哪?

SQL-创建表在 SQL Server Management Studio SSMS 中不起作用