2015-08-27 52 views
0
SELECT 
     person.bu_id, 
     key.key_val, 
     obj_person_add.person_contact_freq, 
     obj_person_add.person_contact_best, 
     OBJ_PERSON_ADD.PERSON_CONTACT_INST, 
     OBJ_PERSON_ADD.PERSON_CONTACT_DATE, 
     OBJ_PERSON_ADD.PERSON_BROCHURES, 
     OBJ_PERSON_ADD.PERSON_NEWSLETTER 
FROM obj_person person 
INNER JOIN obj_person_add 
     ON person.obj_id = obj_person_add.obj_id 
LEFT JOIN obj_rel_key key 
     ON key.obj_id = person.obj_id 
WHERE person.bu_id in (6,7) 
     AND person.close_date IS NULL 
     AND key.obj_key_id = 806 
     AND ( 
      obj_person_add.person_contact_freq IS NOT NULL 
      OR obj_person_add.person_contact_best IS NOT NULL 
      OR OBJ_PERSON_ADD.PERSON_CONTACT_INST IS NOT NULL 
      OR OBJ_PERSON_ADD.PERSON_CONTACT_DATE IS NOT NULL 
      OR OBJ_PERSON_ADD.PERSON_BROCHURES IS NOT NULL 
      OR OBJ_PERSON_ADD.PERSON_NEWSLETTER IS NOT NULL 
     ); 

我已經建立了這個查詢,但是person_brochures和person_newsletters存儲在一個var數組中。這意味着他們返回(例如6172,6544 ...)。我想做一個左連接來將var數組中的ID與另一個表中的名稱進行匹配。如何加入var數組值

我是否必須循環var數組,然後以某種方式匹配ID的呢?

+0

這是Oracle企業數據庫還是MySQL? – Mureinik

+0

是的,我正在使用Oracle。 –

回答

0

我不是100%清楚,我猜你正在用C#.Net寫這段代碼。

您需要確定問題將在哪裏解決,您是要在應用層還是持久層中解決問題?

我假設你想要在持久層中解決它,你有幾個選項 1.生成一個準備好的語句並執行語句..代替連接,你將不得不依賴於IN運算符..etc

  • 使用存儲的過程中,兩個陣列爲逗號分隔的字符串傳遞給一個存儲過程
  • 可以看看這個例子中,如果您需要解決在Oracle功能..所以你可以按照你原先的想法做一個連接。

    Splitting string into multiple rows in Oracle

  • 使用Oracle對象關係功能,並適當地映射數據結構的結構和使用的Oracle MULTISET像集合來解決該查詢在存儲過程中..等
  • 1

    你可以嘗試一種叫做收集unnesting

    SELECT 
         person.bu_id, 
         ... 
         OBJ_PERSON_ADD.PERSON_BROCHURES, 
         OBJ_PERSON_ADD.PERSON_NEWSLETTER 
    FROM obj_person person 
    INNER JOIN obj_person_add 
         ON person.obj_id = obj_person_add.obj_id 
    ..., 
    TABLE(OBJ_PERSON_ADD.PERSON_BROCHURES) x 
    INNER JOIN your_other_table 
         ON x.column_value = your_other_table.id 
    ... 
    

    column_value是分配給VARRAY元素的Oracle僞列名稱。