繁体   English   中英

如何在SQL查询中获得“全部”

[英]How to get “all” in a sql query

这是数据库架构

Parts 
  (pid:integer, pname:string, year:integer, price:integer)

Suppliers 
  (sid:integer, sname: string, state:string, zipcode:string)

Orders 
  (pid:integer, sid:integer, quantity:integer)

查找所有州提供的零件的名称。

查找提供所有零件的供应商的邮政编码。 列出每个邮政编码一次。

对于在“全部”问题上如何解决这些问题,我有些困惑。 我不知道如何编写一个可以包含所有内容的查询。

我们正在学习除法和聚合。

有时英语用法可能很微妙,“ all”被用作“ any”的同义词。 在这种情况下,这是不正确的,因此大多数答案都遗漏了您问题的重点。 确保两组具有多行的情况正确的一种方法是将它们加起来,然后比较总数。 这就是两个查询中所有count()表达式的原因。

这是邮政编码问题的一种可能性:

select zipcode
from Suppliers
where
    (select count(pid) from Parts) =
    (select count(distinct pid) from Orders where sid = Suppliers.sid)

这是第二个:

select name
from Parts
where pid in (
    select Orders.pid,
    from Suppliers inner join Orders on Orders.sid = Suppliers.sid
    group by Orders.pid
    having
        count(distinct Suppliers.state) =
        (select count(distinct state) from Suppliers)
)
**To get all names using mysql**

从零件中选择p.pname。p.pid = o.pid join上的o联接订单o.o.sid = s.sid上的供应商s,其中s.state不为null;

**To get distinct names**

从零件中选择不同的p.pname p联接订单o在p.pid = o.pid联接上o在o.sid = s.sid上的供应商s,其中s.state不为null;

或您可以使用'in'关键字..像从零件中选择p.pname p加入订单o在p.pid = o.pid加入供应商在o.sid = s.sid上,其中s.state在(从中选择不同的状态供应商);

“所有状态”表示不要过滤状态。 而如果他们说“ for Ohio”,您将添加一个WHERE子句,例如:

WHERE ZipCode in (SELECT Zip FROM Zips WHERE State = 'OH')

该子查询从假定的zips表中获取您的状态,替换为,但是您将zip转换为状态。 但是,就您而言,您还是不需要。

Select pname from Parts where pid IN (Select pid from Orders where Suppliers.sid = Orders.sid)

对于第二个类似。 “全部”是指,您不应在该字段上添加where子句。

HTH!

-选择所有州提供的零件名称-

select t.pid, max(pname) from
(
    -- states, where pname was supplied from --
    select distinct p.pid, p.pname, s.state
    from 
    Parts p 
    join
    Orders o on o.pid = p.pid
    join 
    Suppliers s on s.sid = o.sid
) t
group by t.pid
-- part was supplied from all state if --
having count(t.state) = 
    (
        -- total number of states
        select count(distinct state) from Suppliers
    )

-选择提供所有零件的供应商的邮政编码-

select max(s.zipcode)
from 
Suppliers s
join Order o
on o.sid = s.sid
group by s.sid
having count(distinct o.pid) = (select count(distinct pid) from Parts)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM