【问题标题】:SQL - extract random sample from joined tablesSQL - 从连接表中提取随机样本
【发布时间】:2011-12-10 19:03:32
【问题描述】:

我必须用来自 TAB_B 的随机记录 (5%) 填充一个空表 (TAB_A),并与其他 3 个表 (C1、C2、C3) 连接。

现在,如果我运行以下查询,一切正常:

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_A.field3,其值在TAB_C3中。 所以我重写了我之前的查询:

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"....但没有成功:同样的错误再次出现。

顺便说一句,以下查询完美运行:

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

谁能帮帮我?

【问题讨论】:

标签: sql oracle select join random


【解决方案1】:

试试

...

选择 B.ID_TASS、B.ID_SEZ、C3_Z_ID

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

【讨论】:

  • 试过,但没有成功:同样的错误,但在不同的字段 ORA-00904:“B.ID_SEZ”无效标识符。所以我重写了:SELECT TASS_ID, SEZ_ID, C3_Z_ID FROM (SELECT B.ID_TASS as TASS_ID, B.SEZIONE_NUM as SEZ_ID, C3.Z_ID AS C3_Z_ID, row_number() ... 但是出现了一个新错误:ORA-00942 Table or View not存在。
  • @albus2011: 然后尝试将 WHERE r ) FROM B)*0.05 更改为 WHERE r ) FROM TAB_B )*0.05
  • 完成,但现在错误是 ORA-00001 违反了唯一约束。
  • @albus2011:tab_a 有主键还是唯一约束?尝试选择 DISTINCT TASS_ID、SEZ_ID、C3_Z_ID
  • '@shurik - 是的 TAB_A 有一个主键。我尝试了 SELECT DISTINCT 但又出现 ORA-00001 错误。
【解决方案2】:

虽然我没有测试,但以下应该可以工作

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

【讨论】:

  • '@josephj1989 - 错误 ORA-00904:“intTab.Z_ID”标识符无效
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 2020-12-13
  • 2013-06-04
  • 2015-03-14
  • 2013-05-04
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
相关资源
最近更新 更多