执行简单查询的多种独特方式(ORACLE)?

时间:2013-09-23 19:16:59

标签: sql database oracle

我必须提出5种不同的方法(独特的执行计划)来​​处理以下查询。

查找所有供应商提供的商品。

我的数据库包含以下表格:

QSPL - 它包含供应商名称列表

  • SPLNO(号码)
  • SPLNAME(varchar)

QDEL - 它包含送货项目,供应商和部门

  • DELNO(号码)
  • DELQTY(号码)
  • ITEMNAME(varchar)
  • DEPTNAME(varchar)
  • SPLNO(号码)

QITEM - 它包含项目列表

  • ITEMNAME(varchar)
  • ITEMTYPE(varchar)
  • ITEMCOLOR(varchar)

我能够成功地提出以下四个独特的查询。

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个唯一查询。 有没有人有线索?

我试图将这个问题放在最佳可能的背景下,并提供非常详细的反馈意见。

由于

3 个答案:

答案 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操作符。