2011-10-19 41 views
1

我已經填充一個空表(TAB_A)與來自TAB_B隨機記錄(5%)萃取隨機樣本,加入了與其它3個表(C1,C2,C3)。SQL - 從連接表

現在,如果我運行下面的查詢一切正常:

INSERT INTO TAB_A (field1,field2) 
    SELECT TAB_B.ID_TASS, TAB_B.ID_SEZ 
    FROM (SELECT TAB_B.*, row_number() 
      OVER (ORDER BY dbms_random.VALUE) r 
      FROM TAB_B) 
    WHERE r < (SELECT COUNT(*) FROM TAB_B)*0.05 

的問題是,我也需要填寫其值在TAB_C3的TAB_A.field3。 所以我重寫我前面的查詢:

INSERT INTO TAB_A (field1,field2,field3) 
    SELECT B.ID_TASS, B.ID_SEZ, C3.Z_ID 
    FROM (SELECT B.*, row_number() 
      OVER (ORDER BY dbms_random.VALUE) r 
      FROM TAB_B B 
       JOIN TAB_C1 C1 on C1.X_ID = B.X_ID 
       JOIN TAB_C2 C2 on C2.Y_ID = C1.Y_ID 
       JOIN TAB_C3 C3 on C3.Z_ID = C2.Z_ID 
      WHERE C3.Z_ID = 9) 
    WHERE r < (SELECT COUNT(*) FROM B)*0.05 

但出現錯誤:ORA-00904: 「C3.Z_ID」 無效的標識符。

我想問題可能是在聲明中 「SELECT B.ID_TASS,B.ID_SEZ,C3.Z_ID」,我在改變 「SELECT TAB_B.ID_TASS,TAB_B.ID_SEZ,TAB_C3.Z_ID」 ....但沒有成功:再次發生相同的錯誤。

順便說一句,下面的查詢工作perfectely:

select count(*) 
    from TAB_B B 
     JOIN TAB_C1 C1 on C1.X_ID = B.X_ID 
     JOIN TAB_C2 C2 on C2.Y_ID = C1.Y_ID 
     JOIN TAB_C3 C3 on C3.Z_ID = C2.Z_ID 
    WHERE C3.Z_ID = 9 

任何人可以幫助我嗎?

+0

如果你擔心性能,你可能要考慮使用示例:http://download.oracle.com/docs/cd/E11882_01/server.112/e26088/statements_10002 .htm#i2065953 –

回答

0

嘗試

...

SELECT B.ID_TASS,B.ID_SEZ,C3_Z_ID

FROM(SELECT * B.,C3.Z_ID AS C3_Z_ID, ROW_NUMBER() ...

+0

嘗試過,但沒有成功:相同的錯誤,但在不同的字段ORA-00904:「B.ID_SEZ」無效標識符。所以我改寫:SELECT TASS_ID,SEZ_ID,C3_Z_ID FROM(SELECT B.ID_TASS爲TASS_ID,B.SEZIONE_NUM爲SEZ_ID,C3.Z_ID AS C3_Z_ID,ROW_NUMBER()...但出現新的錯誤:ORA-00942表或視圖不存在 – albus2011

+0

@ albus2011:然後嘗試改變WHERE r <(SELECT COUNT(*)FROM B)* 0.05 to WHERE r <(SELECT COUNT(*)FROM ** TAB_B **)* 0.05 – schurik

+0

done,但現在錯誤是ORA-00001唯一約束違反 – albus2011

0

以下應該工作,雖然我沒有測試過

INSERT INTO TAB_A (field1,field2,field3) 
>  SELECT intTab.ID_TASS, intTab.ID_SEZ, intTab.Z_ID 
>  FROM (SELECT B.*, c3.z_id,row_number() 
>    OVER (ORDER BY dbms_random.VALUE) r 
>    FROM TAB_B B 
>     JOIN TAB_C1 C1 on C1.X_ID = B.X_ID 
>     JOIN TAB_C2 C2 on C2.Y_ID = C1.Y_ID 
>     JOIN TAB_C3 C3 on C3.Z_ID = C2.Z_ID 
>    WHERE C3.Z_ID = 9) intTab 
>  WHERE intTab.r < (SELECT COUNT(*) FROM B)*0.05 
+0

'@ josephj1989 - 錯誤ORA-009 04:「intTab.Z_ID」無效標識符 – albus2011