Sql 右括号缺失问题
这就是我写的问题Sql 右括号缺失问题,sql,Sql,这就是我写的问题 Select C.CUST_NAME,P.PROD_DESCRIP from Customer C JOIN (Ord O,OrderItem OT, Product P) ON (C.CUST_ID = O.CUST_ID AND O.ORD_ID = OT.ORD_ID AND OT.PROD_ID = P.PROD_ID) GROUP BY C.CUST_NAME ORDER BY OT.ORDITEM_QTY DESC 但问题是它给了我右括号缺少的问题尽管在某些数
Select C.CUST_NAME,P.PROD_DESCRIP from Customer C
JOIN (Ord O,OrderItem OT, Product P) ON (C.CUST_ID = O.CUST_ID AND O.ORD_ID = OT.ORD_ID AND OT.PROD_ID = P.PROD_ID) GROUP BY C.CUST_NAME ORDER BY OT.ORDITEM_QTY DESC
但问题是它给了我右括号缺少的问题尽管在某些数据库中允许使用连接语法,但分割连接确实要清晰得多:
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;
顺便说一句,这可能不是你想象的那样。它返回一个客户名称和一个任意的产品描述
。然后按任意数量对结果排序——可能来自同一行或不同行
如果要获取客户名称以及该客户的最大数量的产品,可以执行以下操作:
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\u 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)中使用。尽管这种连接语法在某些数据库中是允许的,但分割连接确实要清晰得多:
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;
顺便说一句,这可能不是你想象的那样。它返回一个客户名称和一个任意的产品描述
。然后按任意数量对结果排序——可能来自同一行或不同行
如果要获取客户名称以及该客户的最大数量的产品,可以执行以下操作:
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\u 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,则应将其标记为MySQL。如果您使用的是MySQL,则应将其标记为MySQL。我正在SQLPLus中尝试使用它,在SqlItemManager-@Gordon上使用相同的查询Linoff@TerrilThomas . . . 如果它“起作用”,那就是运气。查询返回每个客户的任意产品描述。这就是我所需要的。但SQL Plus不适用于这一点。你能告诉我这个问题吗。我也尝试过你的解决方案,但它给了我一个逐条款的问题。你能告诉我为什么它不给我一个逐条款的问题吗Expression@TerrilThomas . . . 因为当我打算删除它时,我离开了
groupby
子句。seqnum=1
做了类似的事情。我正在SQLPLus中尝试,同样的查询在SQLItemManager-@Gordon上工作Linoff@TerrilThomas . . . 如果它“起作用”,那就是运气。查询返回每个客户的任意产品描述。这就是我所需要的。但SQL Plus不适用于这一点。你能告诉我这个问题吗。我也尝试过你的解决方案,但它给了我一个逐条款的问题。你能告诉我为什么它不给我一个逐条款的问题吗Expression@TerrilThomas . . . 因为当我打算删除它时,我离开了groupby
子句。seqnum=1的seqnum执行类似的操作。