2012-02-08 48 views
0

屬性我有兩個表看起來像這樣:獲得匹配的兩個表中

 A      B 
id_attr value   id id_attr value 
--------------   ------------------- 
    1  a   1  2  b 
    2  b   1  3  c   
    3  c   2  2  b 
    4  NULL   2  4  d 
         2  5  e 
         3  1  aaa 
         3  3  c 

表A是我的參考表,我在表B(每組條目用相同的ID cosists多個條目類似於表A的結構的(id_attr,value)對。目標是檢查表A中的條目是否與表B中的任何條目匹配(一個或多個)。當表B中存在的每個屬性與一個ID中的相似屬性匹配時,一個條目與另一個條目匹配。另外,在表A中,值可以爲NULL,但在表B中不可以。

在上面的例子中,我的查詢應該返回「1」,因爲只有ID爲1的條目完全匹配表A中的相似條目.Id 2不匹配,因爲在表中屬性4的值爲NULL,它有一個在表A中不存在的屬性。即使屬性3相似,但是屬性1不匹配,Id 3也不匹配。

正如你所看到的,實現了不匹配現有的表A中的條目中的每一個應該被匹配,但如果在表B中存在的屬性然後將其值必須匹配表A similiar值

在Oracle查詢中實現此結果的最有效方法是什麼?

每一個幫助將不勝感激。如果我沒有足夠清楚地表達我的意見,我可以爲更多的問題提供答案。

+0

從你的匹配規則的描述,這聽起來好像對例如數據的查詢應返回2和3,因爲表B中每個id_attr的所有值都與表A中的值相同。您聲明查詢應該返回1 - 您能澄清嗎? – 2012-02-08 13:52:45

+0

它應該返回1,因爲它匹配由多個屬性組成的條目,並且只有ID爲1的條目具有與表A中的值相匹配的值的每個屬性。 – Ziouas 2012-02-08 14:06:33

+0

當您說「它匹配由多個屬性組成的條目」時,是否表示所有B中的條目由A中的單個字母組成,重複多次?如果是這樣,A中的值是否會長於單個字母? – 2012-02-08 14:13:52

回答

3

你可以嘗試以下方法:

SELECT ID, MIN(IS_OK) FROM 
(
    SELECT B.ID ID, 
     DECODE(B.VALUE, A.VALUE, 'Y', 'N') IS_OK 
    FROM A INNER JOIN B 
    ON B.ID_ATTR = A.ID_ATTR 
) 
GROUP BY ID; 

將返回你B的ID和指示該ID是否完成的標誌。

(請注意,解碼會好好的照顧空的值進行比較,而無需測試空值)

+0

內部連接,解碼和分鐘的組合,哇。它看起來不錯,我檢查了我的樣本值,經過微小的修改後,它工作正常。謝謝! – Ziouas 2012-02-08 14:08:26

+0

@Ziouas不客氣,(什麼是微小的修改?) – 2012-02-08 14:11:09

+0

一個簡單的where子句,但它沒有在我的問題中提到,所以可以安全地假設這個解決方案是完全正確的。如果我遇到任何未來的問題,我會寫。再次感謝。 – Ziouas 2012-02-08 14:31:25