SQL列不包含值

时间:2017-07-10 09:19:54

标签: sql oracle select plsql

我想请你帮我解决问题

我目前有SQL表PRODUCTPRODUCT_PARAMETER

PRODUCT有一个有趣的字段:PRODUCT_ID(以及其他一些,不重要)。

PRODUCT_PARAMETERPRODUCT上的PRODUCT_ID相关联,并且列KEYVALUE

我需要查找所有没有PRODUCT_PARAMETER关键字“费用”的产品,或者他们有参数但价值为NULL。可以PRODUCT_PARAMETER使用不同的密钥

另外,由于我使用它的系统的限制,我无法改变数据库的结构,必须在一个SQL命令中执行,后者可能会给我带来最大的痛苦,因为我对能够相当自信从DB中拉出我需要的一半

SELECT PRODUCT_ID FROM PRODUCT MINUS 
SELECT PRODUCT_ID FROM PRODUCT_PARAMETER WHERE KEY LIKE 'cost';

提取没有参数的产品

SELECT PRODUCT_ID FROM PRODUCT_PARAMETER WHERE KEY LIKE 'cost' AND VALUE IS NULL

用于在现有密钥中提取具有NULL值的产品。

在顶层,我需要将这两个结果放入单个sys_refcursor中,这个蓝图就像这样定义了

FUNCTION VALIDATION_FCTN RETURN SYS_REFCURSOR IS
    v_rc sys_refcursor;
BEGIN
    OPEN v_rc FOR #fillSelectStatementHere;
    RETURN v_rc;
END;

只要它返回单个refcursor中的所有值,我可以稍微修改一下,以防合并游标优于SELECT语句。虽然我对SQL编程非常新鲜,之前从未见过PLSQL,所以如果可能的话,我更喜欢SELECT解决方案。

提前谢谢

2 个答案:

答案 0 :(得分:0)

所以你需要摆脱没有成本的产品:

SELECT PRODUCT_ID 
  FROM PRODUCT 
MINUS 
SELECT PRODUCT_ID 
  FROM PRODUCT_PARAMETER  
  WHERE KEY = 'cost' AND VALUE IS NOT NULL

答案 1 :(得分:0)

替代方案,可能会产生更好的计划:

SELECT P.PRODUCT_ID
FROM PRODUCT P
LEFT OUTER JOIN PRODUCT_PARAMETER PP
    ON PP.PRODUCT_ID = P.PRODUCT_ID
    AND PP.KEY = 'cost'
WHERE PP.VALUE IS NULL
如果没有带有键PP.VALUE的产品参数,并且当参数确实存在时,

'cost'将为null,但该值为空。

假设:

  • PRODUCT (PRODUCT_ID)是唯一的。
  • PRODUCT_PARAMETER (PRODUCT_ID, KEY)是唯一的。