2

Oracle データベースに 2 つのテーブルがあります (10g Express)

  • 製品
  • 商品画像

1 つの商品に複数の画像を含めることができます。productしたがって、 からへの 1 対多の関係がproduct_imageあり、product_imageテーブルには、テーブルの主キーを参照する外部キーがありproductます。

テーブル内の画像に関係なく、取得される結果セットの各行に1つの画像名のみを含む製品のリストをフェッチする必要があります (一部の製品には画像がありません)。product_image

product_imageテーブルから取得されるイメージ名は、通常、各製品product_imageの各セットのイメージを昇順で並べ替えた後の、テーブル内の最初のイメージ名です。次のようなもの。

prod_id    prod_name    prod_image

      1    aaa          aaa.jpg      //The first image name in the product_image table after sorting images for prod_id in ascending order.
      2    bbb          bbb.jpg      //Similar to the first case.
      3    ccc            -          //No image(s) found in the product_image table 
      4    ddd            -          //Similar to the previous case.

これら 2 つのテーブルの一般的な結合ステートメントは、次のようになります。

SELECT p.prod_id, p.prod_name, pi.prod_image 
FROM product p 
INNER JOIN product_image pi 
ON p.prod_id=pi.prod_id;

これは、単一の SQL ステートメントを使用して可能ですか?

4

3 に答える 3

1

あなたの質問を正しく理解していれば、次のクエリが機能すると思います。私はそれをテストしていません。

SELECT p.prod_id, p.prod_name, MIN(DBMS_LOB.substr(pi.prod_image, 1))
FROM product p LEFT JOIN product_image pi 
ON p.prod_id=pi.prod_id 
GROUP BY p.prod_id, p.prod_name
ORDER BY p.prod_name;
于 2013-01-22T14:57:54.880 に答える
1

これを試してみてください。prod_id ごとに各画像の行番号を生成して使用できます。欠落している商品画像から null または空白を返すには、左外部結合を使用する必要があります

WITH CTE AS
(

SELECT prod_id, DBMS_LOB.substr(prod_image,1,4000) prod_image, 
row_number() over (partition by prod_id order by prod_image) rn
FROM product_image
)

SELECT p.prod_id, p.prod_name, nvl(pi.prod_image,'-') prod_image
FROM product p 
LEFT OUTER JOIN CTE pi 
ON p.prod_id=pi.prod_id and pi.rn = 1;
于 2013-01-22T14:53:23.027 に答える
0

次の SQL は、質問に記載されているとおりに機能しました。

SELECT 
     p.prod_id,
     p.prod_name,
     t.prod_image 
FROM
     product p 
LEFT OUTER JOIN(
     SELECT 
           pi.prod_image_id,
           pi.prod_id,
           pi.prod_image 
     FROM
           product_image pi 
     INNER JOIN (
           SELECT 
                MIN(pi.prod_image_id) AS prod_image_id 
           FROM 
                product_image pi
           GROUP BY 
                pi.prod_id
     ) prod_image 
     ON pi.prod_image_id=prod_image.prod_image_id
)t ON p.prod_id=t.prod_id ORDER BY p.prod_id DESC;

参照:

于 2013-04-11T10:58:22.603 に答える