Вставка случайно выбранных записей 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);
Другие вопросы по тегам