我有以下表格,它们以模式的形式表示:
问题是,我不知道如何从多个表中搜索数据并在软件接口中表示数据。虽然我可以表示它,但是我不能从表中检索数据。因此,这里是我需要获取的所需数据。
我得去拿:
订购id 100商品的客户的
发布于 2021-04-16 05:06:43
你的问题:
使用id 100订购商品的客户的
select name from customer where cid in (select distinct(cid) from order where iid= 100) ;
已订购笔记本电脑(即“膝上型计算机”类型)的客户的
select name from customer where cid in (select distinct(cid) from order where iid=(select iid from item where type='laptop')) ;
已经订购了笔记本电脑和台式电脑的
select name from customer where cid in (select distinct(cid) from order where iid in (select iid from item where type in ('laptop','desktop') )) ;
发布于 2021-04-16 10:54:28
已订购id 100.商品的客户的
我们可以首先运行一个查询,用包含给定项id的订单查找customer id,然后查找客户名称。这是通过一个IN
子句完成的。
SELECT c.cname
FROM Customer c
WHERE c.cid IN (
SELECT o.cid
FROM Order o
WHERE o.iid = 100
)
客户只返回一次,这是由IN
子句的Set语义保证的,但是如果数据库允许多个具有相同名称的客户,则可能会多次返回相同的客户名称。
要只返回客户名一次,即使有多个具有相同名称的客户,我们也可以使用DISTINCT
子句。如果这样做,我们可以将查询更改为使用普通的JOIN
。
SELECT DISTINCT c.cname
FROM Order o
JOIN Customer c ON c.cid = o.cid
WHERE o.iid = 100
更好的是品味的问题,我相信他们会表现得差不多一样。就我个人而言,我更喜欢第一个。
订购了笔记本电脑(即“膝上型计算机”)的客户的名称。
和以前一样,但是对WHERE
表使用一个Item
条件进行凝视。
SELECT c.cname
FROM Customer c
WHERE c.cid IN (
SELECT o.cid
FROM Item i
JOIN Order o ON o.iid = i.iid
WHERE i.type = 'laptop'
)
SELECT DISTINCT c.cname
FROM Item i
JOIN Order o ON o.iid = i.iid
JOIN Customer c ON c.cid = o.cid
WHERE i.type = 'laptop'
已经订购了笔记本电脑和台式电脑的
已订购所有商品的客户姓名
当使用IN
子句时,我们只需要做两次,就可以找到同时订购这两种商品的客户。
SELECT c.cname
FROM Customer c
WHERE c.cid IN (
SELECT o.cid
FROM Item i
JOIN Order o ON o.iid = i.iid
WHERE i.type = 'laptop'
)
AND c.cid IN (
SELECT o.cid
FROM Item i
JOIN Order o ON o.iid = i.iid
WHERE i.type = 'desktop'
)
另一方面,我们需要使用GROUP BY
而不是DISTINCT
,这样我们就可以检查客户是否订购了这两种产品。
SELECT DISTINCT c.cname
FROM Item i
JOIN Order o ON o.iid = i.iid
JOIN Customer c ON c.cid = o.cid
WHERE i.type IN ('laptop', 'desktop')
GROUP BY c.cid, c.cname
HAVING COUNT(DISTINCT i.type) = 2
或者我们可以把这两种风格混合起来。
SELECT c.cname
FROM Customer c
WHERE c.cid IN (
SELECT o.cid
FROM Item i
JOIN Order o ON o.iid = i.iid
WHERE i.type IN ('laptop', 'desktop')
GROUP BY o.cid
HAVING COUNT(DISTINCT i.type) = 2
)
第三种可能是表现最好的。
https://stackoverflow.com/questions/67119264
复制相似问题