2017-05-16 9 views
1

私はこの質問を解決していました:How can I randomly do a partial outer join in SQL同じ行を複数回割り当てることができるため、最後の作業はありませんでした。 tableA 5行tableB、クエリが予想される行数SQL結合がすべての要素と一致しません

SQL DEMO

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  
  1. セットアップを返さない場合

    しかし、私は説明できない行動を持っています15行。テーブルAの各行に対して3つのランダムtableB行。 3×5 = 15の行

  2. を返す必要があり、合計でだから、にtableAの各行に3個の乱数をASSINGにrandom_id CTEを作成マジックナンバー
  3. に一致するように1から15までrow_number()を作成します。ここでは、二回

    [1]: https://i.stack.imgur.com/awX6

  4. SELECT * FROM random_id; 
    
    を同じ値を代入しかしJOIN行の乱数を返すときも、問題を示し、乱数で15行を見ることができます。より

    enter image description here

  5. SELECT R.*, note 
    FROM random_id R 
    JOIN tableB 
        ON R.magic_number = tableB.rn 
    ORDER BY id    
    
    未満15しかし、私はLEFT JOINを使用する場合代わりに、常に15行を返します。

質問:いつもどのようにJOINリターンより多くの行15行を返し、そしてすべてのrn値がTABLEBである場合、どのように小さい戻る CTE random_id場合。

そして、LEFT JOINは常に15行を返します。

私はちょうど私が残念ながらあなたが一時テーブルまたは他の類似の構築物magic_numberを使用している行を永続化する必要がありますn値と、JOIN

+2

を[ b ug(newid()とテーブル式(ctes))](https://connect.microsoft.com/SQLServer/feedbackdetail/view/350485/bug-with-newid-and-table-expressions) – SqlZim

+1

Paul Whiteさんの大きな説明:https://dba.stackexchange.com/a/30348/43889 – SqlZim

答えて

1

が含まれ、別のクエリをテスト。ここ

rextesterデモ:http://rextester.com/ICS74177

は、残念ながら、あなたがしようとした答えの優雅さが失われない一時テーブルにそれを永続化します。過去に同じ状況に陥って同じことをしようとしていて、同じバグに遭遇しました。あなたが最初にそれに就いたときにいくぶんエキサイティングであり、最終的には失望しています。だからこそ少なくともおめでとう!

私はそう、ここでポール・ホワイトの答え upvoteしてください、任意のより良い、それを説明することはできません。https://dba.stackexchange.com/a/30348/43889

参考:

+0

あなたは私のバグに非常に似ていますが、奇妙な部分は「LEFT JOIN」が回避策のようです: –

関連する問題