2011-10-19 39 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