我有一张桌子,里面有商品,供应商和日期(还有一些其他东西)。我想找到所有独特的商品,供应商,日期在整个日期集中没有日期。从我的值中得出我在表中找到所有日期的集合,并且我想构建一个唯一商品,供应商和日期的列表,它们当前在集合中没有日期属性。例如:
我有数据:
COMMODITY|SUPPLIER|DATE
-----------------------
1 |1 |15.06.16
1 |2 |22.06.16
2 |1 |29.06.16
我希望查询返回:
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
我该怎么做?
答案 0 :(得分:1)
您可以使用cross join
构建所有可能的组合来完成此操作,然后选择存在的组合:
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 :(得分:1)
使用Partition Outer Join这很容易做到:
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
这也意味着您只需要引用该表两次 - 一次获取唯一日期列表,然后再次将表加入您感兴趣的日期列表中,因此它应该相对较高
答案 2 :(得分:0)
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