SQL multiple where子句

时间:2013-05-29 09:22:44

标签: sql jpa

我无法找到使用多个where子句这样的有效与否(我使用JPA,MySQL)我需要多个where子句,其中一个将在这里“不”,或者我错过了什么?

select d from T_DEBIT d where d.status=PENDING and 
where not exists (
select r
from T_REQUEST r
where 
r.debit.id = d.id and
r.status = SUCCESSFUL
)

请询问您是否需要进一步的信息,

5 个答案:

答案 0 :(得分:4)

JPA提供对子查询的支持。 See the specification

  

子查询可以在WHERE或HAVING子句中使用。的语法   子查询如下:

subquery ::= simple_select_clause subquery_from_clause [where_clause
[groupby_clause] [having_clause] 
     

子查询仅限于WHERE和HAVING子句   发布。将考虑支持FROM子句中的子查询   在规范的后续版本中。

您的查询似乎是用SQL编写的,将其转换为JPQL需要做一些事情:

  1. 使用实体名称而不是表名。
  2. 如果statusString类型的字段,请务必将PENDING这样的状态用单引号括起来。
  3. Follow syntax for the exists expression
  4. 我相信您也可以将您的查询编写为连接(PSEUDO CODE):

    select d 
    from T_DEBIT d 
    left join T_REQUEST tr
    on d.id = tr.debit_id
    where d.status = 'PENDING'
    and tr.status = 'SUCCESSFUL`
    and tr.debit_id is null
    

答案 1 :(得分:4)

这是无效的sql:

select d from T_DEBIT d 
where d.status=PENDING 
and where not exists (subquery)

问题是在主查询中出现两次单词where。只需将其删除,即可查询:

select d from T_DEBIT d 
where d.status=PENDING 
and not exists (subquery)

其他答案也有效。

答案 2 :(得分:1)

WHERE中的多个约束和子查询一样正常,但如果使用文字字符串,您可能希望将r.status与引号括起来的值进行比较。除非我们错过了什么。

答案 3 :(得分:0)

这个子查询的目的究竟是什么?简单地将它包含在主查询中会不会轻松多了?

 select d from T_DEBIT d, T_REQUEST r where d.status='PENDING' and r.status != 'SUCCESSFUL' and r.debit.id= d.id

答案 4 :(得分:0)

对于多个 WHERE 子句,请使用 AND ,如:

    SELECT column1, column2, columnN 
    FROM table_name
    WHERE [condition1] AND [condition2] AND [condition3];

有关AND&的更多信息或者:http://www.tutorialspoint.com/sql/sql-and-or-clauses.htm