我必须提出5种不同的方法(独特的执行计划)来处理以下查询。
查找所有供应商提供的商品。
我的数据库包含以下表格:
QSPL - 它包含供应商名称列表
QDEL - 它包含送货项目,供应商和部门
QITEM - 它包含项目列表
我能够成功地提出以下四个独特的查询。
1。
select itemname --, etc.
from qitem
where itemname not in
(select itemname
from qitem, qspl
where (char(splno)+itemname) not in
(select char(splno)+itemname
from qdel));
2
select itemname --,etc.
from qitem
where not exists
(select *
from qspl
where not exists
(select *
from qdel
where qdel.itemname = qitem.itemname
and Qdel.splno = qspl.splno));
3。
select a.itemname --, etc
from qitem a join qdel b on a.itemname = b.itemname
group by a.itemname
having count (distinct splno) = (select count(*) from qspl);
4
select itemname
from qdel
group by itemname
having count (distinct splno) = (select count(*) from qspl);
我不知道如何处理第5个唯一查询。 有没有人有线索?
我试图将这个问题放在最佳可能的背景下,并提供非常详细的反馈意见。
由于
答案 0 :(得分:1)
也许是一些SQL 86语法:
select a.itemname --, etc
from qitem a, qdel b
where a.itemname = b.itemname
group by a.itemname
having count (distinct splno) = (select count(*) from qspl);
或外部联接
select a.itemname --, etc
from qspl s, qdel b
WHERE s.splno (+)= b.splno
group by s.splno
having count (distinct b.splno) = (select count(*) from qspl);
答案 1 :(得分:1)
这是另一种独特的方式(我确信它非常低效):
select distinct splname
from (
select qi.itemname,
qs.splname,
count(distinct qi.itemname) over () as total_items,
count(distinct qd.itemname) over (partition by qd.splno) as items_per_supp
from qitem qi
left join qdel qd on qi.itemname = qd.itemname
left join qspl qs on qs.splno = qd.splno
) t
where total_items = items_per_supp
或者#3的变体可能会使用不同的执行计划:
with supplier_items as (
select splno, count(*) item_count
from qdel
group by splno
)
select splname
from qspl qs
join supplier_items si on qs.splno = si.splno
where si.item_count = (select count(*) from qitem);
答案 2 :(得分:1)
由于这是作业,我会迟钝:查看Oracle MINUS操作符。