0

BOOK_ORDER、ORDER_ITEMS、および BOOKS テーブルを使用して、BOOKS テーブル内のすべての本のタイトル、注文日、および注文番号を一覧表示する OUTER JOIN 操作を使用してクエリを作成します。ORDER_ITEMS.BOOKID の降順で出力を並べ替えます。注文されたことのない本が 3 冊あり、リストの一番上に表示されます。

私はこのクエリを書きました:-

SELECT B.TITLE, BO.ORDERDATE, ORD.ORDERID FROM BOOKS B, BOOK_ORDER BO, ORDERITEMS ORD
WHERE B.BOOKID = ORD.BOOKID
AND BO.ORDERID = ORD.ORDERID(+)
ORDER BY ORD.ORDERID DESC

私は結果を得ていますが、質問の次の部分について混乱しています:-

「まだ注文されていない本が 3 冊あり、リストの一番上に表示されます。」

これは、Orderdate と OrderId が NULL または空白の本を表示する必要があることを意味していると推測しています。しかし、結果セットの上にこれらの行を取得するにはどうすればよいでしょうか? 作成したクエリで何を変更すればよいですか?

これは BOOKS テーブルです:-

Name                                      Null?    Type
----------------------------------------- -------- ---------------
BOOKID                                    NOT NULL NUMBER(15)
ISBN                                               VARCHAR2(10)
TITLE                                              VARCHAR2(30)
PUBDATE                                            DATE
PUBID                                              NUMBER(2)
COST                                               NUMBER(5,2)
RETAIL                                             NUMBER(5,2)
CATEGORY                                           VARCHAR2(12)

これは ORDER_ITEMS テーブルです:-

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------
 ORDERID                                   NOT NULL NUMBER(4)
 ITEMNUM                                   NOT NULL NUMBER(2)
 BOOKID                                    NOT NULL NUMBER(15)
 QUANTITY                                           NUMBER(3)

ここに BOOK_ORDER テーブル構造があります:-

 Name                                      Null?    Type
 ----------------------------------------- -------- --------------
 ORDERID                                   NOT NULL NUMBER(4)
 CUSTOMERID                                         NUMBER(4)
 ORDERDATE                                          DATE
 SHIPDATE                                           DATE
 SHIPSTREET                                         VARCHAR2(20)
 SHIPCITY                                           VARCHAR2(20)
 SHIPSTATE                                          VARCHAR2(2)
 SHIPZIP                                            VARCHAR2(5)
4

4 に答える 4

3

これを試して:

SELECT B.TITLE,
       BO.ORDERDATE,
       ORD.ORDERID
FROM BOOKS B,
     BOOK_ORDER BO,
     ORDER_ITEMS ORD
WHERE B.BOOKID = ORD.BOOKID(+)
  AND BO.ORDERID(+) = ORD.ORDERID
ORDER BY ORD.ORDERID DESC

ちなみに、私見では、(+)演算子ではなく、ANSIJOINキーワードを使用することをお勧めします。

SELECT B.TITLE,
       BO.ORDERDATE,
       ORD.ORDERID
FROM BOOKS B
LEFT OUTER JOIN ORDER_ITEMS ORD ON B.BOOKID = ORD.BOOKID
FULL OUTER JOIN  BOOK_ORDER BO ON BO.ORDERID = ORD.ORDERID
ORDER BY ORD.ORDERID DESC

ここにフィドルがあります

于 2012-05-31T06:05:10.193 に答える
0

多分これが役立つでしょう


SELECT DISTINCT B.TITLE,
                (CASE
                  WHEN B.BOOKID = ORD.BOOKID THEN
                   BO.ORDERDATE
                  ELSE
                   NULL
                END) AS ORDERDATE,
                (CASE
                  WHEN B.BOOKID = ORD.BOOKID THEN
                   ORD.ORDERID
                  ELSE
                   NULL
                END) AS ORDERID
  FROM SO_BOOKS B, SO_BOOK_ORDER BO, SO_ORDER_ITEMS ORD
 WHERE (B.BOOKID = ORD.BOOKID AND BO.ORDERID = ORD.ORDERID)
    OR (B.BOOKID NOT IN
       (SELECT DISTINCT ORD.BOOKID FROM SO_ORDER_ITEMS ORD))
 ORDER BY ORDERID DESC

于 2012-05-31T06:26:41.513 に答える
0

これにより、注文されていない本が一番上に表示されると思います

SELECT B.TITLE, BO.ORDERDATE, ORD.ORDERID FROM BOOKS B, BOOK_ORDER BO, ORDERITEMS ORD
WHERE B.BOOKID = ORD.BOOKID
AND BO.ORDERID = ORD.ORDERID(+)
ORDER BY nvl(ORD.ORDERID,0)

これを試して

于 2012-05-31T05:57:01.497 に答える