我需要將表 B 連接到表 A,其中表 B 的記錄是隨機分配或連接的。大多數查詢都基于它們和條件之間的鍵,我只想在沒有鍵的情況下隨機連接記錄。
我不確定從哪里開始,因為我發現的所有查詢都沒有這樣做。我認為嵌套連接可能對此有所幫助,但是如何在連接時隨機分類記錄?
**Table A**
| Associate ID| Statement|
|:----: |:------:|
| 33691| John is |
| 82451| Susie is |
| 25485| Sam is|
| 26582| Lonnie is|
| 52548| Carl is|
**Table B**
| RowID | List|
|:----: |:------:|
| 1| admirable|
| 2| astounding|
| 3| excellent|
| 4| awesome|
| 5| first class|
結果將是這樣的,串列中的專案不是按順序回圈,而是隨機回圈:
**Result Table**
| Associate ID| Statement| List|
|:----: |:------:|:------:|
| 33691| John is |astounding|
| 82451| Susie is |first class|
| 25485| Sam is|admirable|
| 26582| Lonnie is|excellent|
| 52548| Carl is|awesome|
這些是我嘗試過的一些查詢:
- https://social.msdn.microsoft.com/Forums/sqlserver/en-US/aeb83251-e132-435a-8630-e5b842a69368/random-join-between-tables?forum=sqldataaccess -這似乎回圈了來自'的值表 B',不是隨機的。
- https://www.daveperrett.com/articles/2009/08/11/mysql-select-random-row-with-join -這是基于兩個表之間的公共鍵并回傳其中一個記錄鑰匙,我沒有。
- SQL Join 選擇隨機行時的幫助 - 老實說,我不明白這個,但它似乎沒有為表 A 中的每一行分配亂數,但更多的選擇整體鏈接到上面的鏈接。
- 加入一個表以從第二個表中獲取隨機行 - 這似乎特定于一個鍵,而不是整體隨機。
uj5u.com熱心網友回復:
使用 2 個 CTE,我們生成一個選擇,它根據隨機順序為每個表生成一個行號,然后根據該行號進行連接。
使用 CTE 獲取 B 中記錄的 N 次,如下所述: 根據列值重復行 N 次 (不包括在下面)注意要獲得“N”,您需要從 A 和 B 中獲得計數,然后除以彼此并加1。
假設均勻分布
With A as(
SELECT *, Row_number() over (order by NewID()) RN
FROM A),
B as (
SELECT *, Row_number () over (order by NewID()) RN
FROM B)
SELECT *
FROM A
INNER JOIN B
on A.RN = B.RN
或使用(假設分布不均)
SELECT *
FROM A
CROSS APPLY (SELECT TOP 1 * FROM B ORDER BY NewID()) Z
uj5u.com熱心網友回復:
此方法假設您事先知道哪個是較小的表。
首先,它分配一個從1. 這不一定是隨機的。
然后對于較大表中的每一行,它使用模數運算子隨機計算要加入的范圍內的行號。
WITH Small
AS (SELECT *,
ROW_NUMBER() OVER ( ORDER BY (SELECT 0)) AS RN
FROM SmallTable),
Large
AS (SELECT *,
1 CRYPT_GEN_RANDOM(3) % (SELECT COUNT(*) FROM SmallTable) AS RND
FROM LargeTable
ORDER BY RND
OFFSET 0 ROWS)
SELECT *
FROM Large
INNER JOIN Small
ON Small.RN = Large.RND
這ORDER BY RND OFFSET 0 ROWS是為了提前實作亂數。
這將允許MERGE在較小的表上進行連接。它還避免了有時可能發生的問題,即CRYPT_GEN_RANDOM在計劃中移動并且僅根據需要對每行評估一次而不是評估一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/395958.html
標籤:sql-server 加入 随机的
上一篇:如何從SQLServer中的XML列中提取多個標記值
下一篇:如何使用while回圈更新行?
