私はこの質問を解決していました:How can I randomly do a partial outer join in SQL同じ行を複数回割り当てることができるため、最後の作業はありませんでした。 tableA
5行tableB
、クエリが予想される行数SQL結合がすべての要素と一致しません
WITH tableA as (
SELECT T.id
FROM (VALUES (111), (222), (333), (444), (555)) T(id)
), tableB as (
SELECT *, row_number() over (order by note) as rn
FROM (VALUES ('a'), ('b'), ('c'), ('d'), ('e'),
('f'), ('g'), ('h'), ('i'), ('j'),
('k'), ('l'), ('m'), ('n'), ('o')
) T(note)
), parameter as (
SELECT 3 as row_limit, (SELECT MAX(rn) FROM tableB) as max_limit
), Nums AS (
SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
), random_id as (
SELECT tableA.*, T.n, floor(p.max_limit * RAND(convert(varbinary, newid()))) + 1 magic_number
FROM tableA
CROSS JOIN parameter p
CROSS JOIN (SELECT n
FROM Nums
CROSS JOIN parameter p
WHERE n <= p.row_limit) T
)
-- SELECT * FROM random_id
SELECT R.*, note
FROM random_id R
JOIN tableB
ON R.magic_number = tableB.rn
ORDER BY id
- セットアップを返さない場合
しかし、私は説明できない行動を持っています15行。テーブルAの各行に対して3つのランダム
tableB
行。 3×5 = 15の行 - を返す必要があり、合計でだから、にtableAの各行に3個の乱数をASSINGに
random_id
CTEを作成マジックナンバー に一致するように1から15まで
row_number()
を作成します。ここでは、二回-
を同じ値を代入しかしSELECT * FROM random_id;
JOIN
行の乱数を返すときも、問題を示し、乱数で15行を見ることができます。より -
未満15しかし、私はSELECT R.*, note FROM random_id R JOIN tableB ON R.magic_number = tableB.rn ORDER BY id
LEFT JOIN
を使用する場合代わりに、常に15行を返します。
質問:いつもどのようにJOIN
リターンより多くの行15行を返し、そしてすべてのrn
値がTABLEBである場合、どのように小さい戻る CTE random_id
場合。
そして、LEFT JOIN
は常に15行を返します。
私はちょうど私が残念ながらあなたが一時テーブルまたは他の類似の構築物magic_number
を使用している行を永続化する必要がありますn
値と、JOIN
を[ b ug(newid()とテーブル式(ctes))](https://connect.microsoft.com/SQLServer/feedbackdetail/view/350485/bug-with-newid-and-table-expressions) – SqlZim
Paul Whiteさんの大きな説明:https://dba.stackexchange.com/a/30348/43889 – SqlZim