连接表时行为空

时间:2017-12-01 12:55:09

标签: sql oracle relational-database

我有以下sql语句:

                SELECT 
                    i.ITEM_NO,
                    i.HFB_NO,
                    t.IMAGE_PE_NO
                FROM cpc.item_t i  LEFT OUTER JOIN  cpc.ITEM_IMAGE_T b ON i.ITEM_NO=b.ITEM_NO LEFT  OUTER JOIN  IMAGE_T t ON b.IMAGE_NO=t.IMAGE_NO WHERE i.ITEM_STATE IN ('Saleable','Approved')
                    AND(i.COMCLASS_NAME != 'UTG' OR i.COMCLASS_NAME IS NULL)
                    AND i.ITEM_TYPE IN('ART','SPR')
                    AND i.ITEM_NO='09252748'
                    AND b.IMAGE_USAGE = 'Internet'
                    AND t.IMAGE_SIZE = 'S3'
                ORDER BY HFB_NO, PA_NO, PROD_NAME

上面的sql的结果是0行。

这是错误的,因为我希望SQL返回item_t i的所有数据,即使ITEM_IMAGE_T b中的项目不存在。这就是为什么我在那里有一个Left Join。

但是,如果我删除AND b.IMAGE_USAGE = 'Internet'AND t.IMAGE_SIZE = 'S3',则可以。数据按预期返回。

所以,我的问题是:如果在AND b.IMAGE_USAGE = 'Internet'找到该项目时如何应用AND t.IMAGE_SIZE = 'S3'ITEM_IMAGE_T b,而在找不到该项目时不应用它们?

编辑:

我添加了一个新的加入:LEFT OUTER JOIN cpc.item_cty_spec_t f ON i.ITEM_NO=f.ITEM_NO

所以整个查询现在是:

SELECT DISTINCT
                            i.HFB_NO,
                            i.PA_NO,
                            t.IMAGE_PE_NO,
                            f.ITEM_NO as CTY_ITEM_NO
                        FROM cpc.item_t i
                            LEFT OUTER JOIN cpc.ITEM_IMAGE_T b ON (i.ITEM_NO = b.ITEM_NO AND b.IMAGE_USAGE = 'Internet')
                            LEFT OUTER JOIN IMAGE_T t ON (b.IMAGE_NO = t.IMAGE_NO AND  t.IMAGE_SIZE = 'S3')
                            LEFT OUTER JOIN cpc.item_cty_spec_t f ON i.ITEM_NO=f.ITEM_NO 
                        WHERE
                            i.ITEM_STATE IN ('Saleable', 'Approved')
                            AND (i.COMCLASS_NAME != 'UTG' OR i.COMCLASS_NAME IS NULL)
                            AND i.ITEM_TYPE IN ('ART', 'SPR')
                            AND i.ITEM_NO = '00051570'
                        ORDER BY HFB_NO, PA_NO, PROD_NAME

现在我遇到同样的问题。如果该项目在cpc.item_cty_spec_t中不存在,则仍应从item_t

返回行

2 个答案:

答案 0 :(得分:1)

在这种情况下,将外部联接表列过滤器保留在外部JOIN的ON子句中,而不是WHERE子句。

尝试此代码:

SELECT i.ITEM_NO, i.HFB_NO, t.IMAGE_PE_NO
    FROM cpc.item_t i
         LEFT OUTER JOIN cpc.ITEM_IMAGE_T b ON (i.ITEM_NO = b.ITEM_NO AND b.IMAGE_USAGE = 'Internet')
         LEFT OUTER JOIN IMAGE_T t ON (b.IMAGE_NO = t.IMAGE_NO AND t.IMAGE_SIZE = 'S3')
   WHERE     i.ITEM_STATE IN ('Saleable', 'Approved')
         AND (i.COMCLASS_NAME != 'UTG' OR i.COMCLASS_NAME IS NULL)
         AND i.ITEM_TYPE IN ('ART', 'SPR')
         AND i.ITEM_NO = '09252748'
ORDER BY HFB_NO, PA_NO, PROD_NAME

答案 1 :(得分:0)

如果IMAGE_USAGE为“Internet”并且IMAGE_SIZE为“S3”,则需要提供数据。但是如果连接中不存在,你也想要它,对吧?应忽略使用或大小中的任何其他值。

这应该可以解决问题:

SELECT
    i.ITEM_NO, i.HFB_NO,
    t.IMAGE_PE_NO
FROM
    cpc.item_t i
LEFT OUTER JOIN cpc.ITEM_IMAGE_T b ON i.ITEM_NO=b.ITEM_NO
LEFT OUTER JOIN IMAGE_T t ON b.IMAGE_NO=t.IMAGE_NO
WHERE
    i.ITEM_STATE IN ('Saleable','Approved')
    AND(i.COMCLASS_NAME != 'UTG' OR i.COMCLASS_NAME IS NULL)
    AND i.ITEM_TYPE IN('ART','SPR')
    AND i.ITEM_NO='09252748'
    AND ((b.IMAGE_USAGE = 'Internet' AND t.IMAGE_SIZE = 'S3') OR (b.IMAGE_USAGE is null AND t.IMAGE_SIZE is null))
ORDER BY HFB_NO, PA_NO, PROD_NAME