2014-02-06 135 views
0

这是查询我写缺少右括号问题

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 

但问题是它给了我右括号失踪问题

+0

如果你正在使用MySQL,你应该将其标记为此类。 –

回答

5

虽然这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)中使用。

+0

我正在尝试它在SQLPLus,同样的查询工作SQLITEManager - @Gordon Linoff –

+0

@TerrilThomas。 。 。如果它“有效”,那就是幸运的。该查询返回每个客户的任意产品描述。 –

+0

我就是我需要的。但是同样不适用于SQL Plus。你能指导我解决这个问题吗?我也试过你的解决方案,但它给了我GROUP BY条款问题 –

1
SELECT C.CUST_NAME, P.PROD_DESCRIP 
FROM Customer C 
    INNER JOIN Ord O ON C.CUST_ID = O.CUST_ID 
    INNER JOIN OrderItem OT ON O.ORD_ID = OT.ORD_ID 
    INNER JOIN Product P ON OT.PROD_ID = P.PROD_ID 
GROUP BY C.CUST_NAME 
ORDER BY OT.ORDITEM_QTY DESC 
0
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