Oracle SQL 使用子查询
Oracle SQL using sub queries
我在学习子查询时遇到了一些问题。我正在尝试显示每个客户订购过的最昂贵的书,并使用不相关的子查询来实现。
这是我目前的情况:
select Firstname || ', '|| Lastname "Name", title, retail
from Customers join orders using (Customer#) join orderitems using (Order#)
join books using (Isbn)
where retail =ANY (select max(retail)
from books join orderitems using (isbn) join Orders using (order#) join Customers using (Customer#)
group by Customer#)
order by Firstname, Lastname;
内部查询显示每个客户的最大零售额,但我不确定为什么外部查询会多次显示客户。我刚刚开始学习 SQL,如有任何帮助,我们将不胜感激
select
Firstname || ', '|| Lastname "Name"
,max(retail) "Most expensive book by customer"
from
Customers c, Orders o, OrderItems oi, Books b
where c.customer#=o.customer#
and o.order#=oi.order#
and oi.isbn=b.isbn
group by Firstname || ', '|| Lastname;
这里的缺陷是你的逻辑,而不是语法。内部查询 return 是每个客户的最高零售价,然后外部查询 return 是与这些价格之一匹配的任何连接行。考虑您有两个客户的情况 - 客户 1 进行了购买,一位购买了 10 美元,一位购买了 20 美元,而客户 2 只购买了一次 10 美元的商品。内部查询将 return 20$(客户 1 的最大购买量)和 10$(客户 2 的最大购买量),然后外部查询将 return all 这些金额中的任何一个的购买,即所有三行。 "textbook" 解决方案是 rank
每个客户的购买,并且 return 每个客户只有前一个:
SELECT name, title, retail
FROM (SELECT firstname || ', '|| lastname AS name,
title,
retail,
RANK() OVER (PARTITION BY customer# ORDER BY retail DESC) AS rk
FROM customers
JOIN orders USING (customer#)
JOIN orderitems USING (order#)
JOIN books USING (isbn))
WHERE rk = 1
ORDER BY 1
select Firstname || ', '|| Lastname "Name", title, retail
from Customers join orders using (Customer#) join orderitems using (Order#)
join books using (Isbn)
where (Customer#, retail) in (select Customer#, max(retail)
from books join orderitems using (isbn) join Orders using (order#) join Customers using (Customer#)
group by Customer#)
order by Firstname, Lastname;
或者我喜欢的方式,无需选择相同的东西两次:
select Name, title, Customer#, retail
from (select Firstname || ', '|| Lastname "Name", title, Customer#,
retail, max(retail) over (partition by Customer#) max_retail
from books
join orderitems using (isbn)
join Orders using (order#)
join Customers using (Customer#))
where retail=max_retail
order by Firstname, Lastname;
我在学习子查询时遇到了一些问题。我正在尝试显示每个客户订购过的最昂贵的书,并使用不相关的子查询来实现。
这是我目前的情况:
select Firstname || ', '|| Lastname "Name", title, retail
from Customers join orders using (Customer#) join orderitems using (Order#)
join books using (Isbn)
where retail =ANY (select max(retail)
from books join orderitems using (isbn) join Orders using (order#) join Customers using (Customer#)
group by Customer#)
order by Firstname, Lastname;
内部查询显示每个客户的最大零售额,但我不确定为什么外部查询会多次显示客户。我刚刚开始学习 SQL,如有任何帮助,我们将不胜感激
select
Firstname || ', '|| Lastname "Name"
,max(retail) "Most expensive book by customer"
from
Customers c, Orders o, OrderItems oi, Books b
where c.customer#=o.customer#
and o.order#=oi.order#
and oi.isbn=b.isbn
group by Firstname || ', '|| Lastname;
这里的缺陷是你的逻辑,而不是语法。内部查询 return 是每个客户的最高零售价,然后外部查询 return 是与这些价格之一匹配的任何连接行。考虑您有两个客户的情况 - 客户 1 进行了购买,一位购买了 10 美元,一位购买了 20 美元,而客户 2 只购买了一次 10 美元的商品。内部查询将 return 20$(客户 1 的最大购买量)和 10$(客户 2 的最大购买量),然后外部查询将 return all 这些金额中的任何一个的购买,即所有三行。 "textbook" 解决方案是 rank
每个客户的购买,并且 return 每个客户只有前一个:
SELECT name, title, retail
FROM (SELECT firstname || ', '|| lastname AS name,
title,
retail,
RANK() OVER (PARTITION BY customer# ORDER BY retail DESC) AS rk
FROM customers
JOIN orders USING (customer#)
JOIN orderitems USING (order#)
JOIN books USING (isbn))
WHERE rk = 1
ORDER BY 1
select Firstname || ', '|| Lastname "Name", title, retail
from Customers join orders using (Customer#) join orderitems using (Order#)
join books using (Isbn)
where (Customer#, retail) in (select Customer#, max(retail)
from books join orderitems using (isbn) join Orders using (order#) join Customers using (Customer#)
group by Customer#)
order by Firstname, Lastname;
或者我喜欢的方式,无需选择相同的东西两次:
select Name, title, Customer#, retail
from (select Firstname || ', '|| Lastname "Name", title, Customer#,
retail, max(retail) over (partition by Customer#) max_retail
from books
join orderitems using (isbn)
join Orders using (order#)
join Customers using (Customer#))
where retail=max_retail
order by Firstname, Lastname;