SQL - извлечь случайную выборку из объединенных таблиц - PullRequest
1 голос
/ 19 октября 2011

Мне нужно заполнить пустую таблицу (TAB_A) случайными записями (5%) из TAB_B, объединенными с другими 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

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 19 октября 2011

Следующее должно работать, хотя я не проверял

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 голосов
/ 19 октября 2011

try

...

SELECT B.ID_TASS, B.ID_SEZ, C3_Z_ID

FROM (ВЫБРАТЬ B. *, C3.Z_ID AS C3_Z_ID, row_number () ...

...