SQL 连接和子查询

SQL JOINS AND SUBQUERY

问题 - 显示在销售员 Marshall 处理的订单中购买的产品的产品 ID、名称和标价,标价高于每个类别的所有平均标价.按 Id 升序对输出进行排序。

我的当前查询-

SELECT p.product_id, p.product_name, p.list_price
FROM products p
full outer JOIN inventories i
on i.product_id = p.product_id
full outer JOIN warehouses w
on w.warehouse_id=i.warehouse_id
full outer JOIN department d
on d.location_id = w.location_id
full outer JOIN employees e
on e.manager_id = d.manager_id
WHERE UPPER(e.last_name) = 'MARSHALL';

结果 - null null null

预期结果

ProdId  Product Name           LPrice
     
 2      Intel something        9999.99

额外信息

当我使用查询时

SELECT first_name, last_name
FROM EMPLOYEES
WHERE UPPER(last_name) = 'MARSHALL';

我知道伊莎贝尔·马歇尔

因此我加入了所有表,但我认为我应该使用子查询但不确定如何处理它。

您不想在这里使用完全外部联接。 您的问题是关于产品是在某个销售员处理的订单中购买的,但您的查询是从产品中加入以查找哪些仓库有它,然后谁的经理与该仓库是同一经理 - 它没有回答问题.

我首先将产品加入涉及它们的订单(猜测您的 table 之间的关系):

select p.product_id, p.product_name, p.list_price
from   products p
join   order_items oi
  on   p.product_id = oi.product_id
join   orders o
  on   oi.order_id = o.order_id

订单中的一行有一个 salesman_id,我的第一个猜测是这链接到 salesman_id = employee_id 上的员工,但实际上可能有额外的条件,或者您可能需要改为使用员工 table。这是您的数据,因此您应该查看自己的数据模型并测试一些查询以了解它们如何组合在一起。

如果我的猜测是正确的,您只需加入并过滤即可获得需求的第一部分:

select p.product_id, p.product_name, p.list_price
from   products p
join   order_items oi
  on   p.product_id = oi.product_id
join   orders o
  on   oi.order_id = o.order_id
join   employees e
  on   o.salesman_id = e.employee_id
where  e.last_name = 'Marshall'

下一步是筛选标价大于每个类别的所有平均标价的位置。因此,您可以先获取每个类别的平均标价:

select category_id, avg(list_price) avg_list_price
from   products 
group by category_id

然后您可以将其加入您的主查询(它在 category_id 上是唯一的)并添加一个包含您的平均标价的过滤器。

select p.product_id, p.product_name, p.list_price
from   products p
join   order_items oi
  on   p.product_id = oi.product_id
join   orders o
  on   oi.order_id = o.order_id
join   employees e
  on   o.salesman_id = e.employee_id
join  (select category_id, avg(list_price) avg_list_price
       from   products 
       group by category_id
      ) c
  on   p.category_id = c.category_id
where  e.last_name = 'Marshall'
and    p.list_price > c.avg_list_price
order by p.product_id

我还按 ID 升序添加了订单(假设它指的是 product_id)。假设我对您的数据模型的猜测是正确的,我们就完成了! (我还假设它并不是真正指的是出现在 order_items 中的单位销售价格,但如果需要,这应该很容易更改)。