Java 这些SQL查询等价吗?哪个更好,或者有更好的选择?

Java 这些SQL查询等价吗?哪个更好,或者有更好的选择?,java,sql,spring,hibernate,db2,Java,Sql,Spring,Hibernate,Db2,我正在开发一个利用hibernate连接DB2数据库的SpringWeb应用程序。我试图通过减少DB查询的数量来优化一个在wed服务调用期间可能多次被调用的服务方法 所以我的问题是这个问题 从表a中选择不同的a.* a.ID=B.FK\u ID上的左联接表 a.ID=C.FK\u ID上的左联接表 c.DATA\u RQST\u ID=D.ID上的左联接表 其中b.REQUEST_ID=1234,b.TYPE='TYPE_A' 或者c.REQUEST_ID=1234和c.TYPE='TYPE_A

我正在开发一个利用hibernate连接DB2数据库的SpringWeb应用程序。我试图通过减少DB查询的数量来优化一个在wed服务调用期间可能多次被调用的服务方法

所以我的问题是这个问题

从表a中选择不同的a.* a.ID=B.FK\u ID上的左联接表 a.ID=C.FK\u ID上的左联接表 c.DATA\u RQST\u ID=D.ID上的左联接表 其中b.REQUEST_ID=1234,b.TYPE='TYPE_A' 或者c.REQUEST_ID=1234和c.TYPE='TYPE_A'或c.TYPE='TYPE_B' 与此查询等效/更好

从表A中选择* a.ID在哪里 从表中选择b.FK\u ID 其中b.REQUEST_ID=1234,eb.TYPE='TYPE_A' 或者a.ID 从表c中选择c.FK\U ID 其中c.REQUEST_ID=1234,c.TYPE='TYPE_A' 或 c、 TYPE='TYPE_B'和c.REQUEST_ID IN 从表d中选择d.ID 其中d.REQUEST_ID=1234,v.TYPE='TYPE_A' 还是有更好的选择


两个查询似乎同时运行如果我理解正确,exists将是最佳解决方案:

SELECT a.*
FROM TABLE_A a
WHERE EXISTS (SELECT 1
              FROM TABLE_B b 
              WHERE a.ID = b.FK_ID AND b.REQUEST_ID = 1234 AND b.TYPE = 'TYPE_A'
             ) OR
      EXISTS (SELECT 1
              FROM TABLE_C c JOIN
                   TABLE_D d
                   ON c.DATA_RQST_ID = d.ID
              WHERE a.ID = c.FK_ID AND
                    c.REQUEST_ID = 1234 AND
                    (c.TYPE IN ('TYPE_A', 'TYPE_B'))
             );
一个很大的好处就是删除了select distinct


然后为了性能,您需要表bfk\U id、请求id、类型id和表cfk\U id、请求id、类型、数据id和表id上的索引。

谢谢Gordon,我会尝试一下,我在第一次查询中犯了一个逻辑错误,所以我需要修改一下您的查询。但是,我认为这对我现在所做的工作是有效的。再次感谢您的帮助。有一个很大的区别-在第一个查询中,引用D不是必需的,它被保留为JOIN-ed,而在第二个查询中,它是必需的。根据第二个查询的读取方式,第一个查询中似乎省略了部分条件。“是这样吗?”发条缪斯说,“是的,就是这样。”。我在逻辑上犯了一个错误,但我认为我应该放弃它,因为公认的答案使用了这种逻辑。