Таблица: транзакция

ID Date  
1  11-01 
2  11-01 
3  11-02 
4  11-10 
5  11-12 

Таблица: продукт

ID  Name 
100 ABC  
101 CDE  
102 DEF  

Результат

ID Date  Product
1  11-01 100
2  11-01 101
3  11-02 102
4  11-10 101
5  11-12 102
0
Senthil_Arun 14 Ноя 2019 в 02:35

2 ответа

Лучший ответ

Вы можете использовать встроенный запрос:

select 
    t.id,
    t.date,
    (select top 1 id from product order by newid()) product
from transaction t

Встроенный подзапрос с top 1 и order by newid() дает случайную запись в таблице product.


Изменить

Похоже, что приведенный выше запрос не генерирует достаточно энтропии. Возможно, SQLServer оптимизирует запрос и выполняет встроенный запрос только один раз.

Кажется, работает следующее:

select id, date, product
from (
    select 
        t.id,
        t.date,
        p.id product,
        row_number() over(partition by t.id, t.date order by newid()) rn
    from Transaction t
    cross join Product p
) t
where rn = 1

Это работает путем генерации декартового произведения между таблицами, присвоения случайного ранга каждому произведению для каждого заданного (id, date), а затем фильтрации по верхней записи для каждой группы.

Демонстрация DB Fiddle :

id | date  | product
-: | :---- | ------:
 1 | 11-01 |     100
 2 | 11-01 |     101
 3 | 11-02 |     100
 4 | 11-10 |     102
 5 | 11-12 |     101

NB: transaction - зарезервированная работа в SQL; не используйте это для имени таблицы в реальной жизни ...

2
GMB 14 Ноя 2019 в 00:04

В этом случае я считаю, что коррелированный подзапрос работает нормально:

select t.id, t.date,
       (select top 1 id
        from product p
        where t.id <> p.id
        order by newid()
       ) product
from transaction t;
0
Gordon Linoff 14 Ноя 2019 в 01:07