【问题标题】:SQL Column does not include valueSQL 列不包含值
【发布时间】:2017-12-13 23:03:58
【问题描述】:

我想请你帮我解决一个问题

我目前有 SQL 表 PRODUCTPRODUCT_PARAMETER

PRODUCT 有一个有趣的领域:PRODUCT_ID(还有其他一堆,不重要)。

PRODUCT_PARAMETER 链接到PRODUCT_ID 上的PRODUCT,并具有KEYVALUE 列。

我需要找出所有没有PRODUCT_PARAMETER 键为“cost”的产品,或者它们有参数但值为NULLPRODUCT_PARAMETER 可以有不同的键

另外,由于我使用它的系统的限制,我无法更改数据库的结构,必须在一个 SQL 命令中完成,后者可能是最让我痛苦的,因为我对能够做到从数据库中提取我需要的一半

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 解决方案。

提前谢谢你

【问题讨论】:

  • 为什么LIKE 没有任何通配符? (我可能会改用=。)
  • @jarlh 这只是这里的习惯。当涉及字符串时,所有其他测试都是用 LIKE 编写的,无论是否有通配符。

标签: sql oracle select plsql


【解决方案1】:

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

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在不存在key为'cost'的产品参数且参数确实存在但值为null时为null。

假设:

  • PRODUCT (PRODUCT_ID) 是独一无二的。
  • PRODUCT_PARAMETER (PRODUCT_ID, KEY) 是独一无二的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我现在感觉好傻哦,我想知道为什么我在写这篇文章时没有想到这一点
    猜你喜欢
    • 2018-05-22
    • 2021-10-24
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多