Вставка случайно выбранных записей SQL - PullRequest
1 голос
/ 11 ноября 2009

Я использую 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 ]

4 голосов
/ 12 ноября 2009

Попробуйте добавить 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
0 голосов
/ 12 ноября 2009

Используйте ГДЕ НЕ СУЩЕСТВУЕТ:

 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...