2016-12-08 16 views
8

"ピッキング"に特別な意味があるため、これは実際には答えにくい簡単な質問です。T-SQLでランダムなレコードを選択する方法

私は3人のランダムなピックを1人ずつ与えなければなりません(ピック/ローの番号1,2,3を与える必要があります)。それを難し​​くするのは、人とピックが異なるテーブルから来ており、人とピックとの論理的な結合がないということです。

SELECT TOP 15 database_id, create_date, RowNo, cs.name FROM sys.databases 
CROSS apply ( 
    SELECT top 3 Row_number()OVER(ORDER BY (SELECT NULL)) AS RowNo,* 
    FROM (SELECT top 3 name from sys.all_views ORDER BY NEWID()) T 
) cs 

私は上記の人とピックではないですけど、それは誰もが人を作成せずにそれをテストすることができ、作業SQLは最初のテーブルをピックアップ:

closest I can getです。私は別の人別のピックを与える必要があるのに対し、上記のSQLは、それぞれの人に同じピックを与える

- そして、

それは私が直面してる問題を示しています。

どうすればよいですか?どうも。

+0

upvoted誰かがテストできる*働くSQL * –

+0

@Prdp私は同意します。私は、単純なコピー/ペーストの価値をもっと認識してほしいです。 –

答えて

5

CROSS APPLY内の相関条件を追加すると、あなたの問題を解決します

SELECT TOP 15 database_id, 
       create_date, 
       RowNo, 
       cs.NAME 
FROM sys.databases d 
     CROSS apply (SELECT TOP 3 Row_number() OVER(ORDER BY (SELECT NULL)) AS RowNo, * 
        FROM (SELECT TOP 3 NAME 
          FROM sys.all_views v 
          WHERE d.NAME = d.NAME --Here 
          ORDER BY Newid()) T) cs 

Where句LHSとRHSの両方でalias名を確認し、それだけのためにサブクエリを実行することで、同じtableと同じcolumnからです各行はdatabasesテーブル

+0

いつものように@Prdpに感謝します。明日それをテストし、あなたに戻ってきます。 – xpt

-5

ランダム関数は、ソーステーブルで見つかったレコードIDの範囲内のレコードIDをランダムに選択するために使用できます。

これは動作する可能性がありますが、私は現在それをテストすることはできませんと思うより新しいSQLバージョンでは。旧バージョンのsqlでは、by rand()コマンドはサポートされません。試してみてください。今週末には、SQL 2000以上で動作するようなものを手に入れることができます。私はこの数年前にやらなければならなかった。これはランドでTABLE_NAMEの順序からあなたのSql 2008

選択トップ3に動作するかどうか、私はあなた自身の答えは少し仕事をする変更()

+0

例を共有すると気になる?それはMS T-SQL BTWの下で動くことができなければなりません。 – xpt

+0

私はSQL Serverへのアクセス権を持っていないため、今すぐ次のカップル日以内に試行します。どのようなSQL Serverのバージョンは、あなたの応答を変更する可能性がありますか? –

+0

鉱山は2012CU3です。試してくれてありがとう。あなたがSQLを提供できるなら、私は自分自身を試すことができます。それがうまくいけば、実際には1,2,3の行番号については、私は最終的なフォーマットにピントを合わせるために、ピープ1、ピック2、ピック3のフィールド1つの行 – xpt

0

知ってみましょう。これをチェックして。

SELECT TOP 15 database_id, create_date, RowNo, cs.name FROM sys.databases 
CROSS apply ( 
    SELECT top 3 Row_number()OVER(ORDER BY NEWID()) AS RowNo,* 
    FROM (SELECT top 3 name from sys.all_views ORDER BY NEWID()) T 
) cs 

私が行っている唯一の変化はNEWID()NULLを交換することです。

+0

いいえ、Chamika、 'sys.databases'と' sys.all_views'は普通のテーブルではありません。SQLは実際には動作しますが、実際のケースでは動作しません。実際のテーブルを自分で試すことができます。私が知っている、不一致は私も狂っている。 – xpt

関連する問題