|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Необходимо соединить одну таблицу со случайной строкой из другой таблицы Конструкция вида Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
дает 2 случайных значения для rnd_table2_id и rnd_table2_id_2, одинаковое для всех 20 строк. А мне нужно случайно значение для каждой строки ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 03:01 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Шамиль Фаридович, Вроде как цикл напрашивается. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 03:17 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Шамиль Фаридович, Зависит от того, в какой таблице строк больше. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
P.S. Хотя второй вариант можно использовать в любом случаее ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 07:25 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 08:17 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
aleks222 , Guf , ИМХО неверно. Должно быть что-то типа: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 13:25 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Блин, туплю. Это одно и то же... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 13:43 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Короче говоря, почему не годятся скрипты ни Guf, aleks222. Если мы соединяем набор записей из одной таблицы с 1 случайной записью из другой таблицы, на выходе должен быть набор записей, с количеством строк, равному количеству строк первой таблицы. Создан он должен быть следующим образом: Из полного соединения первой таблицы и второй (генсовокупность) нужно случайным образом отбирать 1 строку для каждого ИД из первой таблицы. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Короче вот, по здравому размышлению. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:01 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
uaggster Если мы соединяем набор записей из одной таблицы с 1 случайной записью из другой таблицы, на выходе должен быть набор записей, с количеством строк, равному количеству строк первой таблицы. Вы бредите. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:09 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
aleks222 uaggster Если мы соединяем набор записей из одной таблицы с 1 случайной записью из другой таблицы, на выходе должен быть набор записей, с количеством строк, равному количеству строк первой таблицы. Вы бредите. Неа. Это вы бредите :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:22 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
uaggster Если мы соединяем набор записей из одной таблицы с 1 случайной записью из другой таблицы, на выходе должен быть набор записей, с количеством строк, равному количеству строк первой таблицы. Именно так! Поэтому метод aleks222 Код: sql 1. 2. 3. 4.
работает только если в обеих таблицах ровно по 20 строк, и то, работать он начинает только после того, как второй cte поправить на Код: sql 1.
Оба метода Guf работают. Но вариант uaggster кажется мне наиболее изящным. Я правда не совсем соображу, как использовать его для UPDATE первой таблицы. Сам же я знаю точно количество строк во второй таблице-справочнике table2 (118), поэтому использовал такую конструкцию: Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 03:48 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
[quot Шамиль Фаридович#22386176] uaggster работает только если в обеих таблицах ровно по 20 строк, и то, работать он начинает только после того, как второй cte поправить на Код: sql 1.
Налицо абсолютное непонимание сути. Шамиль Фаридович Но вариант uaggster кажется мне наиболее изящным. Видимо с точки зрения "подогреть процессор"? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 06:56 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Если у те нужно "к каждой" Код: sql 1. 2. 3. 4.
Но подогрев процессора будет нехилый. Хотя... 118 строк выдержит. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 06:56 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
дубль ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 07:02 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
aleks222 Если у те нужно "к каждой" Код: sql 1. 2. 3. 4.
Но подогрев процессора будет нехилый. Хотя... 118 строк выдержит. Маленькая поправка... Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 09:08 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 09:18 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
invm Код: sql 1. 2. 3. 4.
Формально - не канает. Шамиль Фаридович Необходимо соединить одну таблицу со случайной строкой из другой таблицы "Случайной" - подразумевает ненулевую вероятность повтора. Т.е. две разные строки т1 могут присоединить одинаковые строки из т2. ЗЫ. Ну тредстартеру простительно, он думать не обучен. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 09:38 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Надо выбирать случайные ключи, а не строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 12:22 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Владислав Колосов Надо выбирать случайные ключи, а не строки. И в чем будет разница? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 13:52 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Ну... чтобы не греть процессор, как я понимаю, нужно сгенерировать последовательность 1..N (псевдо)случайных чисел в диапазоне 1..M, где N - это Select count(*) from Первая_таблица, а M - это Select count(*) from Вторая_таблица. Затем пронумеровать выборку из первой таблицы ROW_NUMBER() over (ORDER by 1/0), выборку из второй таблицы - аналогично, и соединить две выборки в соответствие с ранее полученной последовательностью. Собственно, вопрос в генерации последовательности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 15:37 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
И, собственно, сделать так - можно. Но это столь ужасно, что лучше уж cross join Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
Хотя, возможно, есть вариант заменить рекурсию... чем нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 16:25 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
uaggster что лучше уж cross join Cross join плох тем, что вы выполняете абсолютно ненужную генерацию херовой тучи строк. Из которых вам нужны только 20. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 17:14 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Всё, нашел быстрое и адекватное решение, подходящее для больших выборок. Жаль, работать будет только в 2017+ Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 18:30 |
|
JOIN со случайной строкой таблицы
|
|||
---|---|---|---|
#18+
Кстати, последовательность, с т.з. количества строк случайной таблицы - получилось в высшей степени равномерной: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
9765 10212 10000 0.043772032902 100 Жаль только добротность (равновероятность появления конкретного значения R после некоторого значения R) и цикличность исследовать не получается. Я просто не знаю как это сделать на TSQL. Но вроде как прямо мастхэв получается! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 18:56 |
|
|
start [/forum/topic.php?fid=46&msg=40105872&tid=1684177]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 237ms |
total: | 497ms |
0 / 0 |