2013-05-07 42 views
0

首先請不要將其標記爲重複項,因爲我不是要求選擇,而是創建新表。爲了更清楚,我有這樣一個表:創建其列屬性爲另一行的表的表格

CREATE TABLE Attributes (
    Col_Name VARCHAR(45) NULL, 
    Col_type VARCHAR(45) NULL, 
    Col_ID VARCHAR(45) NULL 
); 

Col_Name | Col_type| Col_ID 
----------------------------------------------- 
C1   T1  1 
C2   T2  2 

,我想結束有這樣的事情:這些

C1(T1)| C2(T2) 
---------------- 
Val  Val 

謝謝

+0

我尋覓了一點,但一切都是執行一些特殊的「選擇」有關,但我需要有一個新的表在這裏,如果你能告訴我什麼是實現這一目標的可能性,因爲我明白,這可能不是直截了當。謝謝 – 2013-05-07 07:46:34

+1

'SELECT Col_Name,Col_Type,Col_ID FROM Attributes'然後用你的編程語言處理它,並把它放到一個HashTable中,例如。 – Adder 2013-05-07 07:58:46

+0

你能給我一個java的小例子嗎?無論如何,非常感謝你:) – 2013-05-07 08:01:39

回答

1

這些程序是在Oracle中,一應該適合你的問題。這將創建具有與行數一樣多的列的表格。

屬性的屬性和固定列類型:

DECLARE 
    lc_string VARCHAR2(2000); 
BEGIN 
    FOR c1 IN (SELECT Col_Name, Col_type FROM Attributes ORDER BY Col_ID) LOOP 
    lc_string := lc_string||c1.Col_Name||'_'||c1.Col_type||'_'||' VARCHAR2(100), '; 
    END LOOP; 
    lc_string := SUBSTR(lc_string,0,(LENGTH(lc_string)-2)); 
    lc_string := 'CREATE TABLE some_name ('||lc_string||')'; 
    EXECUTE IMMEDIATE lc_string; 
END; 
/

屬性爲列類型:

DECLARE 
    lc_string VARCHAR2(2000); 
BEGIN 
    FOR c1 IN (SELECT Col_Name, Col_type FROM Attributes ORDER BY Col_ID) LOOP 
    lc_string := lc_string||c1.Col_Name||' '||c1.Col_type||', '; 
    END LOOP; 
    lc_string := SUBSTR(lc_string,0,(LENGTH(lc_string)-2)); 
    lc_string := 'CREATE TABLE some_name ('||lc_string||')'; 
    EXECUTE IMMEDIATE lc_string; 
END; 
/
+0

非常感謝你的回答,但甲骨文不斷告訴我,「即時」未知命令.. – 2013-05-07 09:30:37

+0

儘量把屏幕上的lc_string,看看它是否是正確的格式(全部',()'已經到位)。 EXECUTE IMMEDIATE是Oracle中的標準PL/SQL語句。 – 2013-05-07 09:44:00

+0

我也使用Oracle 11g,並且每個方面都正常工作。 – 2013-05-07 09:58:36

1

除非這是因爲它是關於你將要創建的表往往足以讓一個臨時表這是值得的。

不管怎麼說,以下基本SQL將創建創建查詢爲您提供: -

SELECT CONCAT('CREATE TABLE IF NOT EXISTS `sometable` (, ', GROUP_CONCAT(CONCAT('`', Col_Name, '` ', Col_type) ORDER BY Col_ID SEPARATOR ','), ");") 
FROM Attributes 

(假設MySQL的,而不是甲骨文)

的打法結合我與DARK_As PROC例子SQL一下: -

DECLARE 
BEGIN 
    FOR c1 IN (SELECT 'CREATE TABLE IF NOT EXISTS `sometable` (, ' || (LISTAGG('`' || Col_Name || '` ' || Col_type, ',') WITHIN GROUP ORDER BY Col_ID) || ');') AS CreateCommand FROM Attributes) LOOP 
    EXECUTE IMMEDIATE c1.CreateCommand; 
    END LOOP; 
END; 
/

請注意,這不是測試(你可能需要一個GROUP BY子句中的表,應在屬性表中包含多個的說明表)。

+0

我認爲你在'''之前的最後一列中會得到一個',',這可能會引起錯誤。 – 2013-05-07 09:04:18

+0

你不應該這樣做,因爲逗號是由group_concat添加的,所以只能用於分隔字段..除非我在某處輸入了錯別字 – Kickstart 2013-05-07 09:16:38

+0

是的,你是對的。沒有注意到。 – 2013-05-07 09:27:19

相關問題