Соединить одну строку в одной таблице с n случайными строками в другой - PullRequest
7 голосов
/ 16 июня 2010

Можно ли сделать соединение на SQL-сервере, который соединяет каждую строку из таблицы A с n случайными строками в другой?Например, скажем, у меня есть таблица клиентов, таблица продуктов и таблица заказов.Я хочу присоединить каждого покупателя к 5 случайным продуктам и вставить эти строки в таблицу заказов.(И каждый клиент должен быть присоединен к 5 собственным случайным строкам, я не хочу, чтобы все клиенты присоединялись к одним и тем же 5 строкам).

Возможно ли это?Я использую SQL Server 2005, и это нормально, если решение специально для этого.

Это странное требование, но я в основном делаю небольшой генератор данных для генерации случайных данных.

1 Ответ

8 голосов
/ 16 июня 2010

Посмотрите на что-то вроде этого

DECLARE @Products TABLE(
        id Int,
        Prod VARCHAR(10)
)

DECLARE @Customer TABLE(
        id INT
)

INSERT INTO @Products SELECT 1, 'a'
INSERT INTO @Products SELECT 2, 'b'
INSERT INTO @Products SELECT 3, 'c'
INSERT INTO @Products SELECT 4, 'd'

INSERT INTO @Customer SELECT 1
INSERT INTO @Customer SELECT 2
--use a cross product select, BUT apply a random order number per customer,
--and only select the 'TOP N' items you require.
;WITH Vals AS (
        SELECT  c.id CustomerID,
                p.id ProductID,
                p.Prod,
                ROW_NUMBER() OVER( PARTITION BY c.ID ORDER BY NEWID()) RowNumber
        FROM    @Customer c,
                @Products p
)
SELECT  *
FROM    Vals
WHERE   RowNumber <= 2
...