2016-10-03 104 views
0

方案: 我將2個表名(f.e. Employees和departments)傳遞給pl/sql過程。 我想這個程序生成WHERE子句,如'WHERE employees.department_id = departments.department_id'所以基本上這個程序必須找到關鍵的關係。Oracle,根據表名生成Where子句

我試圖使用all_constraints表來查找constraint_type ='P'或'F',然後找到關聯的列,但在此表中沒有關於約束中使用哪個列的信息。 有沒有人有一個想法我怎麼能做到這一點(mayby以不同的方式)?

+0

查看all_cons_columns。只是爲了什麼目的,你需要動態sql嗎?我認爲你要重塑ORM。 –

+0

碩士論文 - 測試等 –

回答

1

試試這個代碼:

SELECT UC.OWNER 
,  UC.CONSTRAINT_NAME 
,  UCC1.TABLE_NAME||'.'||UCC1.COLUMN_NAME "CONSTRAINT_SOURCE" 
,  'REFERENCES' 
,  UCC2.TABLE_NAME||'.'||UCC2.COLUMN_NAME "REFERENCES_COLUMN" 
FROM USER_CONSTRAINTS uc 
, USER_CONS_COLUMNS ucc1 
, USER_CONS_COLUMNS ucc2 
WHERE UC.CONSTRAINT_NAME = UCC1.CONSTRAINT_NAME 
    AND UC.R_CONSTRAINT_NAME = UCC2.CONSTRAINT_NAME 
    AND UCC1.POSITION = UCC2.POSITION -- Correction for multiple column primary keys. 
    AND UC.CONSTRAINT_TYPE = 'R' 
ORDER BY UCC1.TABLE_NAME 
,  UC.CONSTRAINT_NAME; 
+0

這將是非常有益的。謝謝! –

+0

你能接受這個答案嗎? – starko

0

如何使用自然連接?

如果列名在兩個表中保持一致,則Natural Join子句將在每個公共列名稱上加入表。

例如,從文檔:

https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljnaturaljoin.html

如果表的國家和城市有命名爲
國家和COUNTRY_ISO_CODE,兩個共列了以下兩個SELECT語句是 等價的:

SELECT * FROM COUNTRIES NATURAL JOIN CITIES 

SELECT * FROM COUNTRIES JOIN CITIES 
USING (COUNTRY, COUNTRY_ISO_CODE) 
+2

如果'employees'和'departments'表都有'manager_id'列,那麼自然連接將在連接條件中包含這個。部門經理是否與員工經理一樣?可能不會,所以你需要非常小心,自然連接,因爲它可能有意想不到的結果。 – MT0

+1

更不用說'name','description','comments','start_date','end_date','status'等等。許多模式使用命名約定,例如'cities.country_id = countries.id'或'cities.city_ctry_id = countries.ctry_id'。我不明白爲什麼Natural Join的發明人認爲它會起作用。 –