首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造当前集合中不存在的值的列表

构造当前集合中不存在的值的列表
EN

Stack Overflow用户
提问于 2016-09-13 20:58:46
回答 3查看 36关注 0票数 0

我有一个表,其中有商品,供应商和日期(一些其他的东西也)。我想找到所有独特的商品,供应商,日期谁没有日期在整个日期设置。这意味着从我的值中,我找到了表中所有日期的集合,并且我想构造一个唯一商品、供应商和日期的列表,这些商品、供应商和日期目前在集合中没有日期属性。例如:

我有数据:

代码语言:javascript
运行
复制
COMMODITY|SUPPLIER|DATE
-----------------------
1        |1       |15.06.16
1        |2       |22.06.16
2        |1       |29.06.16

我希望查询返回:

代码语言:javascript
运行
复制
COMMODITY|SUPPLIER|DATE
-----------------------
1        |1       |22.06.16
1        |1       |29.06.16
1        |2       |15.06.16
1        |2       |29.06.16
2        |1       |15.06.16
2        |1       |22.06.16

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-13 21:09:39

使用Partition Outer Join很容易做到这一点:

代码语言:javascript
运行
复制
WITH sample_data AS (SELECT 1 commodity, 1 supplier, to_date('15/06/2016', 'dd/mm/yyyy') dt FROM dual UNION ALL
                     SELECT 1 commodity, 2 supplier, to_date('22/06/2016', 'dd/mm/yyyy') dt FROM dual UNION ALL
                     SELECT 2 commodity, 1 supplier, to_date('29/06/2016', 'dd/mm/yyyy') dt FROM dual),
             dts AS (SELECT DISTINCT dt FROM sample_data)
SELECT sd.commodity,
       sd.supplier,
       dts.dt
FROM   dts
       LEFT OUTER JOIN sample_data sd PARTITION BY (sd.commodity, sd.supplier) ON (sd.dt = dts.dt)
WHERE  sd.dt IS NULL;

 COMMODITY   SUPPLIER DT
---------- ---------- -----------
         1          1 22/06/2016
         1          1 29/06/2016
         1          2 15/06/2016
         1          2 29/06/2016
         2          1 15/06/2016
         2          1 22/06/2016

这还意味着您只需引用该表两次-一次用于获取唯一日期列表,另一次用于将该表连接到您感兴趣的日期列表,因此它应该具有相对较高的性能。

票数 1
EN

Stack Overflow用户

发布于 2016-09-13 21:02:30

您可以通过使用cross join构造所有可能的组合来完成此操作,然后挑选出现有的组合:

代码语言:javascript
运行
复制
select c.commodity, s.supplier, d.date
from (select distinct commodity from t) c cross join
     (select distinct supplier from t) s cross join
     (select distinct date from t) d left join
     t
     on t.commodity = c.commodity and
        t.supplier = s.supplier and
        t.date = s.date
where t.commodity is null;
票数 1
EN

Stack Overflow用户

发布于 2016-09-13 21:13:38

代码语言:javascript
运行
复制
with t as(
 select 1 as COMMODITY, 1 as SUPPLIER, '15.06.16' as "date" from DUAL
 union all
 select 1,2, '22.06.16' from DUAL
 union all
 select 2,1, '29.06.16' from DUAL
)

select *
  from (select distinct commodity, supplier from t),
       (select distinct "date" from t)
MINUS
select * from t
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39470725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档