|
|
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
Пфф... родилось-таки одним запросом, хоть и в муках... Запишу сюда на память, но может и кому еще пригодится. DDL : depts = таблица участков (родительская) и users = таблица сотрудников. Таблица сотрудников имеет поле-ссылку на участки, но оно в первоначальном скрипте = null. Требуется заполнить это поле случайными id'шниками из родительской таблицы, используя rand(): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. update-команда получилась вот такой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Проверочный запрос для показа перекосов (если они есть): Код: sql 1. (во всех строках значения в столбце 'd' должны быть близкими друг к другу). PS. Без материализации рандомов как-то тоскливо... :'( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 14:25:17 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
Напиши один раз и используй повторно. create global temporary table gtt_random (value integer not nul primary key); create procedure fill_randoms(max_value number; count integer); Еще можно процедуру для нормального распределения сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 17:27:45 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
ГхостикНапиши один раз и используй повторно. create global temporary table gtt_random (value integer not nul primary key); create procedure fill_randoms(max_value number; count integer); Еще можно процедуру для нормального распределения сделать.Не интересно, ибо процедурно. Да и под каждый случай одной такой gtt_random + fill_randoms не напасёшься. Кстати, зачем делать процедуру для нормального распр-я, когда rand() как раз и даёт его ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 18:47:18 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
Зачем под каждый случай свою? Задаешь в параметрах процедуры количество записей и джойнишь gtt к результату по номеру записи из нужной таблицы. Нормальное в математическом смысле, rand дает равномерное (тоже в математическом ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 19:01:30 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
Гхостикджойнишь gtt к результату по номеру записи из нужной таблицы.на примере покажи, плз. Что-то " номер записи" заинтересовал (если это не row_number()over(), конечно же). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 19:42:57 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
Таблоидесли это не row_number()over(), конечно жеОн самый и есть. Но вообще, конечно, выгода мизерная получается. Лучше, наверное, вот этот кусок переделать на динамический sql в процедуре по названию таблицы. Код: sql 1. 2. 3. 4. 5. Кстати, зачем в "b" из depts запрашивается? Нужна же только одна запись, можно и из rdb$database. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 21:00:53 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
ГхостикКстати, зачем в "b" из depts запрашивается? Нужна же только одна запись, можно и из rdb$database.да, ты прав. Это я в пылу "борьбы за идею" упустил :-) Вот так правильнее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 21:45:22 |
|
||
|
Простановка в FK-поле дочерней таблицы случайного значения из родителя
|
|||
|---|---|---|---|
|
#18+
Таблоид, Через GTT будет работать неплохо. Особенно если ID-шники это чаще всего integer. Есть вариант использовать скроллируемые курсоры. Они довольно шустры. Не одним запросом, но зато без GTT и реально быстро. Записей в таблицах users: 63001 depts: 5 Предлагаемый update: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Просто update: Код: sql 1. 2. 3. Через курсоры: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. При количестве записей в depts 10000: Execute time = 1s 591ms Чуть более корректный запрос оценки распределения: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2014, 09:56:49 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38582073&tid=1563805]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
334ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 621ms |

| 0 / 0 |
