2016-12-30 3 views
1

行セット変数をスケーラ変数として使用します。U-SQLは意思決定のために行セット変数を使用します

@cnt = Select count(*) from @tab1; If (@cnt > 0) then @cnt1= select * from @tab2; End;

それは可能ですか?私はブロックする

======================================

いくつかの条件に基づいて複合u-sqlコードは、いくつかの制御テーブルに基づいて言うことができます。私の元のコードでは、10-15個のu-sql文を書きましたが、If文の中でそれらを束縛したいと思います。私は再びテーブルに加わることを試みるので、クロスジョイントをしたくありません。クロスジョインを使用すると、実行時間に大きな節約はありません。 IFステートメントの使用は、条件が満たされない場合、完全なコードが実行されるべきではありません。出来ますか?

+0

すぐにU-SQLを忘れてしまいます。あなたの問題を英語で簡単に定義して書き出します。次に、あなたがU-SQLについて知っていることを知って、あなたの問題に再び取り組みます。既に書いたコードを試して無視してください。 PowershellとU-SQLの組み合わせがあなたの問題を解決する可能性があります。 – wBob

+0

「CROSS JOIN」とパフォーマンスについて - 実際に試してみましたが、パフォーマンスは悪いですか?もしそうならば、私は 'CROSS JOIN'がすぐに短絡することを期待しているので、バグレポートを作成することを検討してください。 – wBob

答えて

0
@cnt1 = 
    SELECT @tab2.* 
    FROM @tab2 
    CROSS JOIN (SELECT COUNT(*) AS cnt FROM @tab1) AS c 
    WHERE c.cnt > 0; 

は(追加説明)クロス戻り@ TAB2からすべての行のデカルト積とCOUNTクエリによって生成された単一の行に参加します。 WHERE条件では、問合せの結果がCOUNT(*)> 0の場合は@ tab2のすべての行、そうでない場合は行がないことが保証されます。

U-SQLスクリプト内の制御フロー駆動型のデータを提供していません:wBobさんとアレックスの答えに追加するには

+0

これ以外のコード専用の解答に説明を追加するとよいでしょう。 – trincot

+0

編集内容をご覧ください... – Ajay

+1

(あなたの編集に続いて)U-SQLにはそのような制御文はありません。関係代数を使って問題を定式化する必要があります。これは、エンジンが実行計画をプリコンパイルして実行を並列化できるようにするための鍵です。 –

1

。現在のIFステートメントでは、式をコンパイル時に評価する必要があります。

U-SQLスクリプトは、単一の宣言的なクエリとして考えてください。したがって、次のオプションがあります。

  1. 問題を関係式で表現してください。つまり、実行を保護するために(クロス)ジョインを作成する必要があります。このようなガードを最適化する際にクエリオプティマイザが不適切な仕事をしていると感じる場合は、問題を報告してみましょう。

  2. スクリプトを複数のスクリプトに分割し、次の手順を実行する前に各スクリプトの結果を確認します。これは、ADFを使用したり、PowershellまたはSDKのいずれかで独自のオーケストレーションを作成することができるオーケストレーションの一形態です。ここでの注意点は、中間結果をファイルに書き込んで、ファイルをオーケストレーションレイヤにダウンロードする必要があることです。

これを言って、それは理論的には、「条件が満たされない場合、この演算子ツリーの残りの部分を実行しない」演算子を持つ限り、言語の代数をすることが可能です。しかし、これは主要な作業項目であり、コンパイル時に現在の制限を超えている非常に大きなクエリプランにつながる可能性があります。上記の1と2のいずれもシナリオに役立たないと感じたら、https://feedback.azure.com/forums/327234-data-lake/suggestions/17635906-please-add-dynamic-if-evaluation-to-u-sqlにあなたの投票を追加してください。

関連する問題