0

私がJavaを使用してやろうとしていることは、次のとおりです。

  • データベースにアクセスする
  • テーブル「Target_stats」からレコードを読み取ります
  • フィールド「threat_level」=0の場合、doAction1
  • フィールド「threat_level」>0の場合、別のテーブル「Attacker_stats」およびdoAction2から追加のフィールドを取得します
  • 次のレコードを読む

これで必要なものはすべて揃いましたが、データベースを1回だけ通過できるようにするよく考えられたSQLステートメントです。これが機能しない場合は、2つの別々のSQLステートメントを使用して、データベースを2回目に通過する必要があると思われます。 。私はcaseステートメントを明確に理解していないので、ifステートメントを使用して疑似コードを提供します。

SELECT A.1, A.2, A.3
   if(A.3 > 0){
      SELECT A.1, A.2, A.3, B.1, B.3 
      FROM A 
      JOIN B 
      ON A.1 = B.1
      }
FROM A

誰かが私の状況に光を当てることができますか?

編集:あなたの時間と努力の両方に感謝します。私はあなたの両方のコメントを理解しており、私はより正しい方向に向かっていると信じていますが、私はまだいくつかの問題を抱えています。以前はSQLfiddleについて知らなかったので、先に進んでサンプルDBを作成し、自分の目的を実証しようとしました。リンクは次のとおりです。http://sqlfiddle.com/# !3/ea108 / 1ここで実行したいのは、target_stats.server_id、target_stats.target、target_stats.threat_levelを選択することです。ここでinterval_id = 3であり、threat_level>0の場合取得したいattack_stats.attacker、attack_stats.sig_nameここでinterval_id=3。繰り返しになりますが、あなたの時間と努力に感謝しますそれは私にとって非常に役に立ちます

編集:いじくり回した後、私はそれを理解しました。手伝ってくれてどうもありがとう

4

1 に答える 1

1

@ Ocelot20 が言ったように、SQL は手続き型コードではありません。行ごとの操作ではなく、セットベースの操作に基づいています。これの直接的な結果の1つは、SELECT異なる列リストを持つ同じ結果セットの行に依存しているため、疑似例のが間違っていることです。

NULLそうは言っても、結合が不可能な値を許容できる場合は、疑似コードの例にかなり近づくことができます。

(とにかく私には)あなたが運転しているものに近いと思われる例を次に示します。

select *
from A 
  left outer join B 
    on A.a = B.d and A.a > 2

この SQLFiddleで実際に動作していることを確認できます。これにより、期待される出力の種類が示されます。

これが実際に言っていることは次のようなものであることに注意してください。

の値が2 より大きい場合、 tableからすべてのレコードをフェッチし、 table からすべてのレコードをAフェッチすると、Bその列は table dの列と同じになります。aAA.a

(これは便宜上選択されました。私のやや不自然な例では、条件付き列をシフトしても、ここで見られるように出力に影響しません)。

于 2012-06-27T01:13:15.007 に答える