2012-06-12 73 views
0

我有一些我無法弄清楚的邏輯難題。如何比較兩列與Oracle中表中兩列的組合?

我有一個表格有兩列代表PK。電棒和Prod_Colour

TableA 
Prods, Date_, Prod_Colour 

One | null  | Red 
One | null  | Blue 
Two | 2012-06-08| Blue 
Two | null | Yellow 
Three| null | Green 
Three| 2012-06-08| Red 

日期可叫做那些電棒不再可從該日起,一旦它再次可用但是日期是可以改變的。

我可以根據日期限制行數。

SELECT a.* 
FROM TABLEA a 
WHERE Date_ > '2012-06-11' or Date_ IS NULL 

但我需要做的就是在這兩個電棒和Prod_Colour組合在排除子查詢使用此表...

,這不是一個很好的解釋,但基本上在上述電棒三個例子其中Prod_Colour ='Red'和Prods Two將排除Prod_Colour ='Blue',但Prod_Colour中的Prod_Colour將被包括在日期>今天或null中。

一如既往,我欣賞任何建議或提示。

在此先感謝。

要嘗試和進一步澄清我有一個查詢,從幾個不同的表中選擇,其中一個表中我需要包括prods和prod_Colour prods和Prod_Colour(組合爲每行的唯一標識符)可用TableA where date_表示它們可用。這些組合不會改變,但date_可以。我會使用tDate來指示今天作爲比較的日期。

Select O.Prods, O.Prod_Colour /*each combination needs to match the combination in TableA */ 
FROM TableB 
Where O.Prods + O.Prod_C in (Select A.Prods + A.Prod_Colour 
          FROM TABLE A WHERE Date_ IS NULL or Date_ > tDate) 

類似的東西。

回答

5

基於上次編輯,好像你正在尋找這樣的結構:

SELECT * 
    FROM tableB 
WHERE (prods, prod_colour) IN 
     (SELECT prods, prod_colour 
      FROM tablea a 
     WHERE date_ > tDate OR date_ is NULL); 
+0

這就是我一直在尋找的東西,你不知道我的努力變得多麼複雜。我需要徹底測試它,但最初的結果看起來完全像我需要的。 – dee

0
SELECT a.* 
FROM TABLEA a 
WHERE (Date_ > '2012-06-11' or Date_ IS NULL) 
AND not (Prods = 'Two' and Prod_Colour = 'Blue') 
AND not (Prods = 'Three' and Prod_Colour = 'Red') 
+0

您將需要大約括號中的OR條件,否則將是不正確的。 –

+0

感謝您回答SQl,但不幸的是我無法排除硬編碼值,因爲根據Prod的可用性,日期可能會在不同日期的不同行中發生變化。所以明天我可能只需要排除Prods ='Two'和Prod_Colour ='Blue' – dee

+0

@dee:那麼您如何根據日期知道排除哪些產品?有沒有存儲有效日期的地方? –