2013-09-29 3 views
1

У меня есть таблица (TableA) с целым столбцом (ColumnA), и в таблице есть данные. Нужно написать отборное заявление, чтобы вставить в эту таблицу с целочисленным столбцом со случайными значениями в 5000. Это значение не должно уже быть в Columna из TableAВыберите случайное число в диапазоне

Insert into TableA (columnA,<collist....>) 

SELECT <newColId> ,<collist....> from TableB <where clause> 
+1

Я надеюсь, что это [статья] (http://www.sqlperformance.com/2013/09/t-sql-queries/random-collisions) помогает. –

ответ

1

вы можете создать таблицу вспомогательных чисел для этого:

-- create helper numbers table, faster than online recursive CTE 
-- can use master..spt_values, but actually numbers table will be useful 
-- for other tasks too 
create table numbers (n int primary key) 

;with cte_numbers as (
    select 1 as n 
    union all 
    select n + 1 from cte_numbers where n < 5000 
) 
insert into numbers 
select n 
from cte_numbers 
option (maxrecursion 0); 

, а затем вставить некоторые номера не имеют в TableA (с использованием присоединиться на row_number(), так что вы можете вставить несколько строк сразу):

;with cte_n as (
    select n.n, row_number() over(order by newid()) as rn 
    from numbers as n 
    where not exists (select * from tableA as t where t.columnA = n.n) 
), cte_b as (
    select 
     columnB, row_number() over(order by newid()) as rn 
    from tableB 
) 
insert into TableA(columnA, columnB) 
select n.n, b.ColumnB 
from cte_b as b 
    inner join cte_n as n on n.rn = b.rn 

Если йо u're уверен, что может быть только одна строка из TableB, который будет вставлен, вы можете использовать этот запрос

insert into TableA(columnA, columnB) 
select 
    a.n, b.columnB 
from tableB as b 
    outer apply (
     select top 1 n.n 
     from numbers as n 
     where not exists (select * from tableA as t where t.columnA = n.n) 
     order by newid() 
    ) as a 

Примечание это лучше иметь индекс на ColumnA колонке, чтобы проверить наличие быстрее.

sql fiddle demo

+0

Я подозреваю, что ваш вложенный подзапрос отрицательно повлияет на производительность при увеличении размера данных. –

+0

Я действительно думаю, что не было бы никакой разницы в производительности (или левое соединение было бы хуже), есть ли у вас какие-либо тесты? –

+0

См. Http://stackoverflow.com/a/2577224/1688441. Возможно, я ошибаюсь, но это актуальная проблема, которую нужно решить. –

Смежные вопросы