虽然这join语法,允许在一些数据库,它是真的更清晰地分裂出连接:
Select C.CUST_NAME, P.PROD_DESCRIP
from Customer C JOIN
Ord O
on C.CUST_ID = O.CUST_ID JOIN
OrderItem OT
on O.ORD_ID = OT.ORD_ID JOIN
Product P
ON OT.PROD_ID = P.PROD_ID
GROUP BY C.CUST_NAME
ORDER BY OT.ORDITEM_QTY DESC;
顺便说一下,这可能不是你想的那样做。它将返回一个客户名称以及任意prod_descrip
。然后以任意数量排序这个结果 - 可能来自相同或不同的行。
如果你想与该客户的最大数量的产品一起获得顾客的名字,你可以这样做:
Select C.CUST_NAME,
substring_index(group_concat(P.PROD_DESCRIP order by OT.ORDITEM_QTY desc), ',', 1) as PROD_DESCRIP
from Customer C JOIN
Ord O
on C.CUST_ID = O.CUST_ID JOIN
OrderItem OT
on O.ORD_ID = OT.ORD_ID JOIN
Product P
ON OT.PROD_ID = P.PROD_ID
GROUP BY C.CUST_NAME;
注意:如果PROD_DESCRIP
可以有一个逗号,那么你将要使用一个不同的分隔符。
编辑:
以上是MySQL解决方案。在Oracle中,你会这样做:
select CUST_NAME, PROD_DESCRIP
from (Select C.CUST_NAME, P.PROD_DESCRIP,
row_number() over (partition by C.CUST_NAME order by OT.ORDITEM_QTY desc) as seqnum
from Customer C JOIN
Ord O
on C.CUST_ID = O.CUST_ID JOIN
OrderItem OT
on O.ORD_ID = OT.ORD_ID JOIN
Product P
ON OT.PROD_ID = P.PROD_ID
) t
where seqnum = 1;
这实际上是首选的标准SQL解决方案。它可以在大多数数据库(SQL Server,Oracle,Postgres,DB2和Teradata)中使用。
如果你正在使用MySQL,你应该将其标记为此类。 –