连接表时行为空

Rows is null when joining tables

我有以下 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 到 return 来自 item_t i 的所有数据,即使 ITEM_IMAGE_T b 中不存在该项目。这就是为什么我在那里有一个左连接。

但是,如果我删除 AND b.IMAGE_USAGE = 'Internet'AND t.IMAGE_SIZE = 'S3',它会起作用。数据按预期 return 编辑。

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

编辑:

我添加了一个新的 JOIN: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 中不存在,它仍应 return 来自 item_t

的行

在这种情况下,将外部联接的 table 列过滤器保留在外部联接的 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

如果 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