0

我正在尝试使用java做的是:

  • 访问数据库
  • 从表“Target_stats”中读取记录
  • 如果字段“threat_level”= 0,doAction1
  • 如果字段“threat_level”> 0,则从另一个表“Attacker_stats”和 doAction2 中获取附加字段
  • 读取下一条记录

现在我拥有了我需要的一切,但经过深思熟虑的 SQL 语句只允许我只通过数据库一次,如果这不起作用我怀疑我将需要使用两个单独的 SQL 语句并再次通过数据库. 我对 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,所以我现在继续制作了一个示例数据库并试图证明我的目的。这是链接:http : //sqlfiddle.com/#!3/ea108/1 我在这里要做的是选择 target_stats.server_id, target_stats.target, target_stats.threat_level where interval_id=3 and if thethreat_level>0 I要检索attack_stats.attacker,attack_stats.sig_name 其中interval_id=3。再次感谢您的时间和精力,这对我非常有用

编辑:经过一番修修补补,我想通了。非常感谢你的帮助

4

1 回答 1

1

正如@Ocelot20 所说,SQL不是过程代码。它基于基于集合的操作,而不是每行操作。这样做的一个直接后果是SELECT您的伪示例中的 是错误的,因为它依赖于具有不同列列表的同一结果集中的行。

NULL也就是说,如果您可以容忍无法连接的值,您可以非常接近您的伪代码示例。

这是一个示例(无论如何对我而言)似乎与您的驾驶目标很接近:

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

你可以在这个 SQLFiddle中看到它的实际效果,它应该会告诉你期望什么样的输出。

请注意,这实际上是这样说的:

从 table 中获取所有记录,并从 table 中A获取任何记录,B其列与table 中的d列相同,前提是 value大于 2。aAA.a

(这是为了方便而选择的。在我相当人为的示例中,移动条件列不会影响输出,如这里所示)。

于 2012-06-27T01:13:15.007 回答