2016-02-23 31 views
1

我有一個table_lookup。這是主表,其具有該表在不同的表中引用像 table_assignment用於恢復SQL中已翻譯列值的動態查詢

emp no. name     Employee category    active/inactive 

1   divya     3        A 
2   abc     FR        A 
3   XYZ     4        I 
4   aMY     100        A 

table_nationality

Emp no.  nationality    

1    QA 
2    RS 
4    RO 

的所有查找代碼等

LOOKUP_TYPE  LOOKUP_CODE MEANING        ENABLED_FLAG 

EMP_CAT   3    Hourly with fixed hours per week Y 
EMP_CAT   4    Hourly        Y 
EMP_CAT   CAS   Casual        Y 
EMP_CAT   FR   Full-time regular     Y 
EMP_CAT   FR_01   Full-time       Y 
ABSENCE_CATEGORY DLHM   Leave        Y 
ABSENCE_CATEGORY DLHNM   Leave on the death of a husband  Y 
ABSENCE_CATEGORY DLR   Leave on the death of a relative Y 
ABSENCE_CATEGORY GB_ADO  Adoption       Y 
ABSENCE_CATEGORY GB_PAT_ADO Paternity adoption     Y 
NATIONALITY  PY   Paraguayan       Y 
NATIONALITY  QA   Qatari        Y 
NATIONALITY  RO   Romanian       Y 
NATIONALITY  RS   Serbian      

這是lookup_code˚F被翻譯爲table_Assignmentemployee_category專欄和國家y列table_nationality

我有這樣一個查詢:

select emp_no., 
     name, 
     employee_category 
    from table_assignment lookup_assignmen, 
     table_lookup lookup_stg 
where lookup_stg.lookup_type = 'EMP_CAT' 
    AND LOOKUP_STG.LOOKUP_CODE = lookup_assignmen.employee_category; 

同樣,對於table_nationality類似:

select emp_no., 
     nationality  
    from TABLE_NATIONALITY lookup_NATIONALITY, 
     table_lookup lookup_stg 
where lookup_stg.lookup_type = 'NATIONALITY' 
    AND LOOKUP_STG.LOOKUP_CODE = lookup_NATIONALITY.employee_category; 

現在我想檢測如果說,例如table_assignment動態查詢有任何僱員類別,它是不是在table_lookup

例如:在table_assignment員工類別列中給出了值100,這在table_lookup中不存在。 應該在查詢中檢索這些值,但查詢應該是動態的,以便它應該檢索table_Assignment,table_nationality或任何其他 表中的所有無效查找值。我可以在查詢中輸入lookup_type和表名,並且應該檢索無效值。

如何將靜態查詢更改爲動態?

+0

爲什麼你想要它是動態的?你有沒有數不清的'孩子桌子'?你如何知道子表中的相關列名?並且子表是否有對查找表的外鍵約束 - 我想這不是來自這個設計。 (呃,你擔心孤兒數據......)爲什麼你把所有東西都放在一個查詢表中,而不是每種類型的查詢表中,這樣可以保證正確的參照完整性? –

+0

@Alex Poole這就是查找代碼在HCM(Oracle HCM)中的存在方式 –

+0

SQL中的動態SQL可能非常棘手,應儘可能避免。一次性PL/SQL函數是否足夠好?或者你是否需要一個構建類似動態查詢的框架? –

回答

2

你可以聯合所有的無效代碼,並避免動態的SQL。

select * 
from (
    select emp_no as entity_id, 'emp_cat' as lookup_type, eployee_category as invalid_lookup_code 
    from table_assignment e 
    left join table_lookup r 
    on e.employee_category = r.lookup_code 
    and r.lookup_type = 'emp_cat' 
    where r.lookup_type is null 
    union all 
    select emp_no as entity_id, 'nationality' as lookup_type, nationality as invalid_lookup_code 
    from table_nationality e 
    left join table_lookup r 
    on e.employee_category = r.lookup_code 
    and r.lookup_type = 'nationality' 
    where r.lookup_type is null 
) as t 
where t.lookup_type = 'nationality' 
+0

這可能是最好的方法。除非有一些不尋常的情況,比如有數百張桌子,或者他們頻繁更換。 –

+0

@ JonHeller-他們可以頻繁更改,是的,有超過100個表...我們只是要檢查inavlid查找代碼.. whatsoeevr的值是 –

1

您可以在SQL中使用將Oracle Data Cartridge與ANY類型組合在一起的包來運行動態SQL。下面的代碼使用這個想法的my open source version

即使使用預先構建的PL/SQL,由於在查詢中構建查詢令人困惑,這仍然是一項困難的任務。目前還不清楚表是如何映射在一起的,看起來沒有外鍵或標準名稱。我假設有一個映射表,或者可以創建一個映射表。在演示中,我創造了這個:

create table lookup_map(
    table_name varchar2(30), 
    column_name varchar2(30), 
    lookup_type varchar2(100) 
); 
insert into lookup_map 
select 'TABLE_ASSIGNMENT', 'EMPLOYEE_CATEGORY', 'EMP_CAT' from dual union all 
select 'TABLE_NATIONALITY', 'NATIONALITY', 'NATIONALITY' from dual; 
commit; 

此代碼將建立併爲每個表運行動態查詢,並會UNION ALL結果。

select * from table(method4.dynamic_query(
    q'[ 
     select replace(replace(replace(q'! 
       select '#TABLE_NAME#' table_name, emp_no, #COLUMN_NAME# 
       from #TABLE_NAME# 
       left join table_lookup 
        on #TABLE_NAME#.#COLUMN_NAME# = table_lookup.lookup_code 
        and table_lookup.lookup_type = '#LOOKUP_TYPE#' 
       where table_lookup.lookup_code is null 
      !', 
      '#TABLE_NAME#', table_name), 
      '#COLUMN_NAME#', column_name), 
      '#LOOKUP_TYPE#', lookup_type) v_sql 
     from lookup_map 
    ]' 
)); 

TABLE_NAME   EMP_NO EMPLOYEE_CATEGORY 
----------   ------ ----------------- 
TABLE_ASSIGNMENT 4  100 

爲了避免引用mark-hell,最好使用替代引用機制(q')和REPLACE。引號在Stackoverflow語法高亮顯示中看起來是無與倫比的,但它在Oracle IDE中應該看起來更好。

這對於這個確切的查詢是矯枉過正的。但它給你很大的發展空間。您可以更改查詢並使其更加動態,而無需任何其他PL/SQL代碼。

+0

肯定會嘗試一下,讓你知道 –

+0

ORA-00904 :「METHOD4」。「DYNAMIC_QUERY」:此錯誤即將到來的無效標識符 –

+0

#table name#是什麼?如在「#」 –