作者cutekid (可爱小孩子)
看板Examination
标题Re: [课业] 列出参与所有专案的供应商名称 SQL巢状查询
时间Thu Jun 14 01:24:13 2018
Q1 解法:
select t2.供应商名称
from 供应商 as t1,专案供应零件 as t2
where t1.供应商代号 = t2.供应商代号
group by t2.供应商名称
having
count(distinct t2.专案代号) = (
select count(*) from 专案 )
说明:
1.
红色部份: 相同供应商下,所参与不同的专案个数
2.
黄色部份: 专案总数
3.
红色 =
黄色的时候,表示该供应商参与所有专案
Q2 解法:
select
distinct t1.供应商名称
from 供应商 as t1,专案供应零件 as t2
where t1.供应商代号 = t2.供应商代号 and exists (
select *
from 供应商 as t3,专案供应零件 as t4,
where t3.供应商名称 = '一级棒' and t3.供应商代号 = t4.供应商代号
and t2.专案代号 = t4.专案代号
)
说明:
1.
黄色部份: 「外层供应商」参与的专案 = 「一级棒」所参与的专案
2.
红色部份: 供应商名称去除重复
※ 引述《gn01398532 (GOA)》之铭言:
: 此题已有人问过,但我还是不解要如何构筑此两层巢状查询
: Q1:列出参与所有专案的供应商名称?
: 题目所给表格:https://imgur.com/FqDfBeX
: 解法是用:不存在任何专案是没有参与的
: 解答就像此网站的解析:https://goo.gl/fZwjDj
: 巢状查询是要视为FROM後面的表格一起看吗?
: 为何第二个FROM後面是专案,最後一个FROM是看专案供应零件?
: 如果我先从最内层解析,
: 最後一个WHERE的条件是连结到两个更外层查询的表格(供应商和专案)
: 就代表我得同时看到最外层的 供应商.专案.专案供应零件 的表格
: 我的问题点在於要如何一步一步建立多层的巢状查询,
: 由内向外、由外向内,或是同时?
: 这种巢状查询要怎麽练习呢?
: ------------------------------------------------------------------------------
: 另外,关於"所有"的sql语法,何时要用"负负得正"的方式来解(即不存在...没有参与)
: 何时要用正向的存在方式来解(即存在)?
: 例如 Q2.列出所有有参与"一级棒供应商有参与的专案"的供应商
: 解答从"找出供应商其不存在任何一级棒参与的专案是没有参与的"
: 感谢各位,搞得我头好痛= =
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.168.16.70
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Examination/M.1528910656.A.71E.html
1F:推 jaskone: 这解法好棒,耳目一新的感觉 06/14 10:24
※ 编辑: cutekid (1.168.16.70), 06/14/2018 13:35:04
2F:推 jaskone: 回过头来看,突然想到Q1里面的t2 专案供应零件栏位里面 07/28 19:30
3F:→ jaskone: 没有供应商名称,只有供应商编号,select t2.供应商名称 07/28 19:30
4F:→ jaskone: ,这样应该不行 对吧? 07/28 19:30