2

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

查找所有供应商交付的项目。

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

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

  • SPLNO(数字)
  • SPLNAME (varchar)

QDEL - 它包含交付项目、供应商和部门

  • 德尔诺(数字)
  • 延迟(数字)
  • 项目名称(varchar)
  • 部门名称(varchar)
  • SPLNO(数字)

QITEM - 它包含项目列表

  • 项目名称(varchar)
  • 项目类型(varchar)
  • 项目颜色(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 个唯一查询。有人有线索吗?

我试图用重要的细节将这个问题放在最好的上下文中,非常感谢反馈。

谢谢

4

3 回答 3

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);
于 2013-09-23T21:14:12.443 回答
1

由于这是家庭作业,我会变得迟钝:查看 Oracle MINUS 运算符。

于 2013-09-23T21:36:35.173 回答
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);
于 2013-09-23T20:34:50.120 回答