2

我在 Oracle 数据库中有两个表(10g 快递)

  • 产品
  • 产品图片

一个产品可以有多个图像。product因此,从to存在一对多关系,product_image并且product_image表具有引用product表的主键的外键。

我需要获取一个产品列表,在检索的结果集的每一行中只有一个图像名称,而不管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.

这两个表的一般连接语句类似于以下内容。

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

试试这个,您可以为每个 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 回答
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 回答
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 回答