Вопрос:

Выберите уникальные случайные строки из таблицы SQL Server, но всегда дублируйте

c# sql sql-server random rows

737 просмотра

2 ответа

3 Репутация автора

Я не лучший с SQL, но я стараюсь изо всех сил, чтобы решить мои проблемы. У меня есть таблица «просто», которая заполнена столбцами (ID (PK, Identity), Char, Serv, Random). Теперь я хочу выбрать случайную строку из этой таблицы и вставить ее в таблицу "f_WinGet". До сих пор все мои процедуры выполняли этот шаг нормально, но я всегда получал дубликаты во второй таблице.

Первая таблица: 84 строки. Вторая таблица: нужно 35 случайных из 84.

Я пробовал много других способов, но я всегда получаю один и тот же результат. Все мои процедуры для случайного связаны с программой Button ia C #. Пока все работает нормально, но у меня всегда есть несколько дубликатов строк в моей таблице.

 INSERT INTO f_TWinGet 
     SELECT TOP 1 Percent Char, Serv, Random
          FROM ( select distinct  Char, Serv, Random from dbo.just) as derived1 
               ORDER BY CHECKSUM(NEWID())

Было бы хорошо, если бы у кого-нибудь была идея, как я могу решить мою проблему. Я все еще пытаюсь, но все, что я получаю, всегда один и тот же результат.

Автор: user3856495 Источник Размещён: 19.07.2014 07:14

Ответы (2)


0 плюса

2276 Репутация автора

Решение

С такой маленькой таблицей вы можете использовать что-то вроде:

INSERT INTO f_TWinGet
SELECT TOP 1 j.Char, j.Serv, j.Random
FROM dbo.just j 
LEFT JOIN f_TWinGet f
ON f.Char = j.Char
AND j.Serv = f.Serv
AND j.Random = f.Random
WHERE f.Char IS NULL
ORDER BY NEWID()

Таким образом, убедитесь, что значения, которые вы пытаетесь вставить, не находятся в финальной таблице.

Автор: bruno Размещён: 19.07.2014 08:13

1 плюс

879327 Репутация автора

Если вы хотите вставить 35 строк, сделайте все сразу:

INSERT INTO f_TWinGet(char, serv, random)
     SELECT TOP 35 Char, Serv, Random
     FROM (select distinct  Char, Serv, Random
           from dbo.just
          ) derived1 
     ORDER BY CHECKSUM(NEWID());

Если вы действительно хотите делать их по одному, я бы предложил использовать not exists:

INSERT INTO f_TWinGet(char, serv, random)
     SELECT TOP 1 Char, Serv, Random
     FROM (select distinct  Char, Serv, Random
           from dbo.just
          ) d
    WHERE not exists (select 1 from f_TWinGet f where t.char = f.char and t.serv = f.serv and t.random = f.random)
     ORDER BY CHECKSUM(NEWID());

Обратите внимание, что charэто зарезервированное слово, поэтому оно должно быть в квадратных скобках. Я оставляю имена, которые у вас есть, в вашем запросе.

Автор: Gordon Linoff Размещён: 19.07.2014 08:46
Вопросы из категории :
32x32