SQL: порядок случайным образом при вставке объектов в таблицу - PullRequest
2 голосов
/ 09 октября 2009

У меня есть UDF, который выбирает 6 лучших объектов из таблицы (с кодом объединения ниже) и вставляет его в другую таблицу. (кстати SQL 2005)

Итак, я вставляю UDF ниже и код выглядит так:

  • выбирает объекты для определенного города и добавляет к ним уровень (из таблицы Европа)
  • объединяет этот выбор с выбором из той же таблицы для объектов из той же страны и добавляет уровень к этим
  • Из объединения сделан выбор, чтобы получить 6 лучших объектов, упорядочить по уровням, поэтому объекты из того же города будут первыми, а если их нет, то объекты из той же страны будут возвращены из выбор.

И моя проблема в том, что я хочу сделать случайный выбор, чтобы получить случайные объекты из таблицы Europe, но, поскольку я вставляю результат своего выбора в таблицу, я не могу использовать order by newid () или rand ( ), потому что они зависят от времени, поэтому я получаю следующие ошибки:

  • Неправильное использование побочного или зависящего от времени оператора в 'newid' внутри функции.
  • Неправильное использование побочного или зависящего от времени оператора в 'rand' внутри функции.

UDF:

ALTER FUNCTION [dbo].[Objects] (@id uniqueidentifier)
RETURNS @objects TABLE
( 
    ObjectId uniqueidentifier NOT NULL,
    InternalId uniqueidentifier NOT NULL
)
AS
BEGIN 
    declare @city varchar(50)
    declare @country int

    select  @city = city,
            @country = country
    from Europe
    where internalId = @id

    insert @objects
    select @id, internalId from
    (
        select distinct top 6 [level], internalId from
        (
            select top 6 1 as [level], internalId
            from Europe N4
            where N4.city = @city
            and N4.internalId != @id            

            union select top 6 2 as [level], internalId
            from Europe N5
            where N5.countryId = @country
            and N5.internalId != @id            

        ) as selection_1
        order by [level]
    ) as selection_2
    return
END

Если у вас есть свежие идеи, поделитесь ими со мной.

(Только, пожалуйста, не предлагайте заказывать по newid () или добавлять столбец rand () с семенем DateTime (по ms или sthg), потому что это не сработает.)

Ответы [ 3 ]

2 голосов
/ 12 октября 2009

Я сам нашел хорошее решение и подумал, что было бы удобно поделиться им:)

 DECLARE @seed1 int  
 DECLARE @seed2 int

 SET @seed1 = DATEPART(SECOND,GETDATE()) 

 SET @seed2 = DATEPART(MILLISECOND,GETDATE())

 SELECT TOP 10 [Column1], [Column2]
 FROM [TABLE]

 ORDER BY ROW_NUMBER() OVER (ORDER BY [KeyColumn]) * seed2 % seed1

Я думаю, что это достаточно просто и довольно удобно

2 голосов
/ 09 октября 2009

Возможно, вы могли бы воспользоваться гидами, добавив параметр позиции к своим входам, а затем передав случайное сгенерированное значение и затем упорядочив по подстроке (internalID, @ Random, 1)

0 голосов
/ 09 октября 2009

Какую версию сервера базы данных вы используете?

В SQL Server 2005 вы можете использовать rand с getdate в качестве начального числа, и функция становится неопределенной.

В более ранних версиях у вас не может быть неопределенных функций, и вместо этого вам придется использовать хранимую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...