连接表时行为空
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
我有以下 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