Вставка случайно выбранных записей SQL
Я использую Microsoft SQL Server 2005.
Я создаю генератор случайных записей, который будет случайным образом вставлять 10 записей во временную таблицу. Записи во временной таблице будут затем использоваться для обновления записей в таблице в памяти.
Вот заявление, которое вызывает у меня некоторые проблемы (предположим, временная таблица уже создана).
insert into #tempTable
select top (10 - @totalOverShort)
d.depositid, d.location, d.amount, d.count, d.user_add,
d.date_add, d.status, d.comments, d.subtotal_difference, d.count_difference, d.user_checked,
d.date_updated, d.ip_checked, newID() as randomColumn
from
closing_balance..cb_depositbag as d
left join
#tempTable as t on d.depositid <> t.depositid and d.location <> t.location
where
d.date_add between @weekPrior and @weekPriorNight and
d.status = 'R' and d.depositID <> t.depositID
order by
randomColumn
Это утверждение дает мне случайно сгенерированные столбцы, но иногда (около 1/10) я получаю 1 или более дубликатов во временной таблице. Таблица в памяти имеет двухкомпонентный ключ, DepositID и Location. Я хочу сказать, что если там не выходит случайно выбранная пара (depositID,location), то вставьте эту запись во временную таблицу. Есть ли другой способ сделать это? Я думаю, причина, по которой есть дубликаты, заключается в том, что он оценивает оператор select более чем в 10 раз, что может привести к дублированию из-за случайного упорядочения. Я не уверен, хотя.
Заранее спасибо.
2 ответа
Попробуйте добавить DISTINCT
, Это должно удалить дубликаты DepositID, расположение пар.
Тем не менее, вы также должны поставить NEWID()
только в ORDER BY
и удалите "randomColumn"
Редактировать: удалить 1=1. Это бессмысленно.
После комментария: Тем не менее, это может не дать вам 10 строк, если внутренний запрос дает дубликаты...
select DISTINCT *
FROM
(
select top (10 - @totalOverShort)
d.depositid, d.location, d.amount, d.count, d.user_add,
d.date_add, d.status, d.comments, d.subtotal_difference, d.count_difference, d.user_checked,
d.date_updated, d.ip_checked
from
closing_balance..cb_depositbag as d
left join
#tempTable as t on d.depositid <> t.depositid and d.location <> t.location
where
d.date_add between @weekPrior and @weekPriorNight and
d.status = 'R' and d.depositID <> t.depositID
order by
newid()
) foo
Используйте, ГДЕ НЕ СУЩЕСТВУЕТ:
insert into #tempTable
select top (10 - @totalOverShort)
d.depositid, d.location, d.amount, d.count, d.user_add,
d.date_add, d.status, d.comments, d.subtotal_difference,
d.count_difference, d.user_checked,
d.date_updated, d.ip_checked, newID() as randomColumn
from
closing_balance..cb_depositbag as d
left join
#tempTable as t on d.depositid <> t.depositid and d.location <> t.location
where
d.date_add between @weekPrior and @weekPriorNight and
d.status = 'R' and d.depositID <> t.depositID order by randomColumn
WHERE NOT EXISTS
(SELECT 1
FROM #tempTable
WHERE depositid = d.depositid);