我有以下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
答案 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