首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从多个表查询并检索数据

从多个表查询并检索数据
EN

Stack Overflow用户
提问于 2021-04-16 04:49:35
回答 2查看 296关注 0票数 0

我有以下表格,它们以模式的形式表示:

  • Customer (cid:整数,cname:字符串,评级:整型,薪水:实)
  • 项(iid: integer,iname: string,type: string)
  • Order (
  • Order)

问题是,我不知道如何从多个表中搜索数据并在软件接口中表示数据。虽然我可以表示它,但是我不能从表中检索数据。因此,这里是我需要获取的所需数据。

我得去拿:

订购id 100商品的客户的

  1. 名称;订购了笔记本电脑的客户的
  2. 名称(即订购了笔记本电脑和台式计算机的
    1. 类型的项目)。订购所有商品的顾客的姓名。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-16 05:06:43

你的问题:

使用id 100订购商品的客户的

  1. 名称。

select name from customer where cid in (select distinct(cid) from order where iid= 100) ;

已订购笔记本电脑(即“膝上型计算机”类型)的客户的

  1. 名称。

select name from customer where cid in (select distinct(cid) from order where iid=(select iid from item where type='laptop')) ;

已经订购了笔记本电脑和台式电脑的

  1. 客户。订购所有商品的顾客的姓名

select name from customer where cid in (select distinct(cid) from order where iid in (select iid from item where type in ('laptop','desktop') )) ;

票数 2
EN

Stack Overflow用户

发布于 2021-04-16 10:54:28

已订购id 100.商品的客户的

  • 名称

我们可以首先运行一个查询,用包含给定项id的订单查找customer id,然后查找客户名称。这是通过一个IN子句完成的。

代码语言:javascript
运行
复制
SELECT c.cname
  FROM Customer c
 WHERE c.cid IN (
          SELECT o.cid
            FROM Order o
           WHERE o.iid = 100
       )

客户只返回一次,这是由IN子句的Set语义保证的,但是如果数据库允许多个具有相同名称的客户,则可能会多次返回相同的客户名称。

要只返回客户名一次,即使有多个具有相同名称的客户,我们也可以使用DISTINCT子句。如果这样做,我们可以将查询更改为使用普通的JOIN

代码语言:javascript
运行
复制
SELECT DISTINCT c.cname
  FROM Order o
  JOIN Customer c ON c.cid = o.cid
 WHERE o.iid = 100

更好的是品味的问题,我相信他们会表现得差不多一样。就我个人而言,我更喜欢第一个。

订购了笔记本电脑(即“膝上型计算机”)的客户的名称。

和以前一样,但是对WHERE表使用一个Item条件进行凝视。

代码语言:javascript
运行
复制
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'
       )
代码语言:javascript
运行
复制
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'

已经订购了笔记本电脑和台式电脑的

  1. 客户。

已订购所有商品的客户姓名

当使用IN子句时,我们只需要做两次,就可以找到同时订购这两种商品的客户。

代码语言:javascript
运行
复制
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,这样我们就可以检查客户是否订购了这两种产品。

代码语言:javascript
运行
复制
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

或者我们可以把这两种风格混合起来。

代码语言:javascript
运行
复制
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
       )

第三种可能是表现最好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67119264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档