【问题标题】:Subqueries using Oracle使用 Oracle 的子查询
【发布时间】:2013-08-19 16:45:41
【问题描述】:

我已经在这个问题上工作了大约 8 个小时,但没有成功。有人有什么想法吗?

问题: 使用正确的表,使用您希望的连接操作创建一个子查询,该查询将列出客户编号、名字和姓氏连接在一起,以及所有订购最昂贵书籍的客户的城市(基于零售价) .给出“客户名称”的组合客户名称列和别名。

这是我的代码:

SELECT book_customer.customerid, lastname || ', ' || firstname AS "Customer Name", city
FROM book_customer, book_order, order_items 
    WHERE book_customer.customerid = book_order.customerid
        AND book_order.orderid = order_items.orderid
            AND bookid =
            (
            SELECT MAX(retail) 
                FROM books 
                    GROUP BY bookid
            )
;

结果:

 SQL> SELECT book_customer.customerid, lastname || ', ' || firstname AS "Customer Name", city
  2   FROM book_customer, book_order, order_items 
  3    WHERE book_customer.customerid = book_order.customerid
  4     AND book_order.orderid = order_items.orderid
  5      AND bookid =
  6      (
  7      SELECT MAX(retail) 
  8       FROM books 
  9        GROUP BY bookid
 10      )
 11  ;
    SELECT MAX(retail)
    *
ERROR at line 7:
ORA-01427: single-row subquery returns more than one row

我也试过这个:

SELECT customerid, lastname || ', ' || fistname AS "Customer Name", city
FROM book_customer, book_order
    WHERE book_customer.customerid = book_order.customerid
        AND orderid = 
        (
        SELECT orderid
            FROM order_items
                AND bookid =
                 (
                 SELECT bookin
                    FROM books
                        GROUP BY bookid
                            HAVING MAX(retail)
                  )
        )
;

结果:

  SQL> SELECT customerid, lastname || ', ' || fistname AS "Customer Name", city
  2   FROM book_customer, book_order
  3    WHERE book_customer.customerid = book_order.customerid
  4      AND orderid = 
  5      (
  6      SELECT orderid
  7       FROM order_items
  8         AND bookid =
  9          (
 10          SELECT bookid
 11            FROM books
 12              GROUP BY bookid
 13                HAVING MAX(retail)
 14           )
 15      )
 16  ;
       AND bookid =
       *
ERROR at line 8:
ORA-00907: missing right parenthesis

ERD

Book_Customer TABLE

CustomerID              PK
Lastname
Firstname
Address
City
State
Zip
Referred

Book_Order TABLE

OrderID               PK
CustomerID            FK
OrderDate
ShipDate
ShipStreet
ShipCity
ShipState
ShipZip

Order_Items TABLE

OrderID               PK/FK
ItemNum               PK/FK
BookID
Quantity

Books TABLE

BookID                PK
ISBN 
Title
PubDate
PubID                 FK
Cost
Retail
Category

任何帮助将不胜感激。

【问题讨论】:

  • 在你的第二个例子中,姓氏有一个逗号,|| - 尝试删除它。
  • 谢谢,但还是有问题。
  • 小心分享新错误
  • 第一条错误信息非常明显:您的表中有多个名为“customerid”的列,因此您必须明确指出您想要哪个“customerid”。跨度>
  • 谢谢,错过了。抱歉,我没有你那么有经验,但感谢您指出显而易见的事情。

标签: oracle


【解决方案1】:

试试这个:

SELECT
Book_Customer.CustomerID, 
Book_Customer.lastname || ', ' || Book_Customer.firstname AS "Customer Name", 
Book_Customer.city
FROM Order_Items 
JOIN Book_Order ON Order_Items.OrderID = Book_Order.OrderID
JOIN Book_Customer ON Book_Customer.CustomerID = Book_Order.CustomerID
JOIN Books ON Books.BookID = Order_Items.BookID
WHERE Books.Retail = (SELECT MAX(Retail) FROM Books)

【讨论】:

  • 成功了!谢谢。当服务器重新启动时,我将尝试使用我尝试使用的连接来让它工作以供将来参考。感谢您的帮助!
  • 我对编辑不好,我有点累(我已经在这工作了大约 14 个小时),并认为这就是你更新进度的方式。
【解决方案2】:

你需要分解任务...

第一步是确定您正在处理哪本书 - 如下所示:

Select BookID from books where RowNum=1 order by retail desc

这基本上成为您的子查询,然后您可以在联接中使用它来收集您需要的数据。

我可以为你解决整个问题,但这不会教给你任何东西——这些东西总是很繁琐,只有通过玩弄你才能学会......

【讨论】:

  • 感谢您的反馈。
  • 许多其他答案可以返回多本书的数据(如果不止一本书共享最高零售价)。我不确定,鉴于您已被告知使用子查询和连接,这就是您的教师将要寻找的......
  • 相信我,我已经搞定了。
【解决方案3】:

对于第一个错误,请尝试以下查询

 SQL> SELECT bc.customerid, lastname || ', ' || firstname AS "Customer Name", city
2   FROM book_customer bc, book_order bo, order_items  oi
3    WHERE book_customer.customerid = book_order.customerid
4     AND book_order.orderid = order_items.orderid
5      AND bookid =
6       (
 7      SELECT MAX(retail) 
 8       FROM books 
 9        GROUP BY bookid
10      )

请在查询中提供 tablename.column 名称,因为同一列可以存在于查询中使用的多个表中。我看到 CustomerId 存在于多个表中。您也可以使用别名。就像我在上面所做的那样

对于第二个问题,我提供了有错误的评论:-

SELECT customerid, lastname || ', ' || fistname AS "Customer Name", city
2   FROM book_customer, book_order
 3    WHERE book_customer.customerid = book_order.customerid
 4      AND orderid = 
 5      (
 6      SELECT orderid
7       FROM order_items
8         AND bookid =--no where caluse here it should be WHERE bookid=
9          (
10          SELECT bookin
 11            FROM books
 12              GROUP BY bookid
 13                HAVING MAX(retail)
   14           )
 15      )

【讨论】:

  • 感谢您的反馈。
【解决方案4】:

试试这个,

 SELECT a.customerid, a.lastname || ', ' || a.firstname AS Customer_Name, a.city
   FROM book_customer a, 
        book_order b, 
        order_items c 
  WHERE a.customerid = b.customerid
   AND b.orderid = c.orderid
   AND c.bookid =
 (
      SELECT MAX(retail) 
        FROM books 
      GROUP BY bookid
 );

【讨论】:

  • 感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
相关资源
最近更新 更多