2017-07-10 122 views
1

我想請你幫我一個問題SQL列不包括價值

我現在有SQL表PRODUCTPRODUCT_PARAMETER

PRODUCT有一個有趣的領域:PRODUCT_ID(和其他一堆,不重要)。

PRODUCT_PARAMETER鏈接到PRODUCTPRODUCT_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'; 

需要拉出產品無論是一半沒有在現有拉出產品具有NULL值的參數和

SELECT PRODUCT_ID FROM PRODUCT_PARAMETER WHERE KEY LIKE 'cost' AND VALUE IS 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解決方案。

預先感謝您

+0

爲什麼'LIKE'沒有任何野生卡? (我可能會用'='來代替)。 – jarlh

+0

@jarlh好吧,這只是一個習慣。所有其他測試都是在有字符串的情況下使用LIKE編寫的,而不是通配符。 – erewien

回答

0

所以你要擺脫它沒有空產品成本:

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

現在我覺得如此的愚蠢O.o我想知道爲什麼當我寫這篇文章時,這並沒有出現 – erewien

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'的產品參數並且該參數表存在但該值爲空,則該值爲空。

假設:

  • PRODUCT (PRODUCT_ID)是獨一無二的。
  • PRODUCT_PARAMETER (PRODUCT_ID, KEY)是獨一無二的。