我正在尝试使用简单的查询来获取报表的一些必要行。这是查询: -
SELECT DISTINCT Z.ITEMDESC, X.NMCODDES AS CODE
FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z
WHERE
X.NMHRDCDE='PKZ'
AND Y.FINISHGD='Y'
AND X.COMPCODE=Z.COMPCODE
AND Y.COMPCODE=Z.COMPCODE
AND X.COMPCODE=Y.COMPCODE
AND Y.USERDEF1=X.NMSOFCDE
AND Y.ITEMCODE=Z.ITEMCODE
AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND NVL(:P12,Z.DOCTDATE)
但由于某些原因,我无法在{WH}中使用X.NMHRDCDE='PKZ'
。所以,我只是在CASE WHEN Expression中使用X.NMHRDCDE='PKZ'
。就像那样: -
SELECT DISTINCT Z.ITEMDESC,
CASE
WHEN X.NMHRDCDE='PKZ'
THEN X.NMCODDES
END AS CODE
FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z
WHERE
-- X.NMHRDCDE='PKZ'
Y.FINISHGD='Y'
AND X.COMPCODE=Z.COMPCODE
AND Y.COMPCODE=Z.COMPCODE
AND X.COMPCODE=Y.COMPCODE
AND Y.USERDEF1=X.NMSOFCDE
AND Y.ITEMCODE=Z.ITEMCODE
AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND NVL(:P12,Z.DOCTDATE)
在这种情况下,每行都与NULL NMCODDES字段重复。检查输出 - output
我无法理解为什么每个项目都有一个额外的空行。在上面的代码中使用ELSE
没有任何区别。因为我可以确保在我的数据库中每个项目都有一个唯一的NMHRDCDE
。因此,即使在案件中使用ELSE
也无法解决我的问题。
有人可以帮我解决问题吗?
答案 0 :(得分:1)
试试这个:
select a.ITEMDESC,b.CODE from
(SELECT DISTINCT Z.ITEMDESC
FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z
WHERE
-- X.NMHRDCDE='PKZ'
Y.FINISHGD='Y'
AND X.COMPCODE=Z.COMPCODE
AND Y.COMPCODE=Z.COMPCODE
AND X.COMPCODE=Y.COMPCODE
AND Y.USERDEF1=X.NMSOFCDE
AND Y.ITEMCODE=Z.ITEMCODE
AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND NVL(:P12,Z.DOCTDATE)) as a
LEFT JOIN
(SELECT DISTINCT Z.ITEMDESC,
CASE
WHEN X.NMHRDCDE='PKZ'
THEN X.NMCODDES
END AS CODE
FROM NMCODMAS X, NMITEMAS Y, NMSALREC Z
WHERE
-- X.NMHRDCDE='PKZ'
Y.FINISHGD='Y'
AND X.COMPCODE=Z.COMPCODE
AND Y.COMPCODE=Z.COMPCODE
AND X.COMPCODE=Y.COMPCODE
AND Y.USERDEF1=X.NMSOFCDE
AND Y.ITEMCODE=Z.ITEMCODE
AND Z.DOCTDATE BETWEEN NVL(:P11,Z.DOCTDATE) AND NVL(:P12,Z.DOCTDATE)) as b
on a.ITEMDESC = b.ITEMDESC
答案 1 :(得分:1)
忽略这些行的唯一方法是:
select * from (/*YOUR QUERY*/) where code is not null;
正如WJack写的那样,当案例不匹配并且行为正确时,你的空值会被篡改。 Where子句定义将返回哪些行,case定义将为行返回的内容。因此,您的第二个查询会返回任何X.NMHRDCDE
的行,但没有X.NMHRDCDE != 'PKZ'