需要SQL选择查询的帮助吗

需要SQL选择查询的帮助吗,sql,select,join,Sql,Select,Join,需要一些关于这个查询的帮助,我只是想知道我正在做的是好的还是我需要加入以得到更好的结果。对不起,如果这是一个愚蠢的问题,但我有点担心,因为我查询同一个表三次。提前谢谢 Select * from TableA where (A_id in (1, 2, 3, 4) and flag = 'Y') or (A_id in (select A_id from TableB where A_id in

需要一些关于这个查询的帮助,我只是想知道我正在做的是好的还是我需要加入以得到更好的结果。对不起,如果这是一个愚蠢的问题,但我有点担心,因为我查询同一个表三次。提前谢谢

Select * 
from TableA 
where (A_id in (1, 2, 3, 4) 
       and flag = 'Y') or 
      (A_id in 
            (select A_id from TableB 
             where A_id in 
                        (Select A_id from TableA 
                         where (A_id in (1, 2, 3, 4) 
                           and flag = 'N') 
             group by A_id 
             having sum(qty) > 0)
    )
表A和表B之间的关系是一对多

条件或逻辑:

如果该标志为真,则无需进一步检查即可选择数据 如果标志为false,我们必须参考表B以查看qty列的总和是否大于0
你的方法确实太复杂了。从其中标志=Y或相关B的总和>0中选择。在子查询中执行后者

select *
from a
where a_id in (1,2,3,4)
and
(
  flag = 'Y' 
  or 
  (select sum(qty) from b where b.a_id = a.a_id) > 0
)

您是否可以将此查询拆分为存储过程

例如:

分隔符$$ 创建函数标志选择my_标志varchar1 返回varchar255-TODO:更改为适当的输出 开始 声明返回值varchar255;-TODO:更改为适当的输出 如果标志='Y' 然后 -执行选择,无需进一步检查 -返回值=查询; 其他的 -请参阅表B,查看“数量”列的总和是否大于0 -返回值=查询; 如果结束; 返回_值; 结束$$ 定界符;
您提出的查询没有什么大问题,但是可以进行一些改进。如果您将Flag='N'的测试移动到第一个从表A中选择并将您的从表B中选择与第一个从表A中选择相关联,则您可以省去第二个从表A中选择:

Select * 
from TableA A
where A_id in (1, 2, 3, 4) 
  and (flag = 'Y'
   or (flag = 'N' 
  and A_id in (select A_id
                from TableB B
               where b.A_id = a.A_id
               group by A_id 
              having sum(qty) > 0))
    );
这将消除在表A上额外查找本应已知信息的情况。第二,由于TableA.A_Id现在与TableB.A_Id关联,因此表中的A_Id。。。可以更改为exists子句:

Select * 
from TableA A
where A_id in (1, 2, 3, 4) 
  and (flag = 'Y'
   or (flag = 'N' 
  and exists (select A_id
                from TableB B
               where b.A_id = a.A_id
               group by A_id 
              having sum(qty) > 0))
    );
这可能会根据数据库类型通知数据库查询优化器,在找到第一行后,它可以停止从TableB检索行


在Oracle数据库中的一个未编制索引的小样本数据集上,这两项更改将查询成本降低25%,因此性能可能会显著提高。

感谢您对marc_s格式的帮助,我将在下一篇文章中采用它:看起来很完美!谢谢Thorsten。这是可能的,但将纯SQL中可以完成的事情更改为过程代码将导致性能下降。Sentinel,在我的数量列中,我只有0或任何正数。如果找到正数据,是否会提示停止查询?它是DB2数据库。顺便说一句,这是一个很好的建议,如果我们能够在找到正数据后忽略所有其他条目,那么性能肯定会有很大的提高。我只是做了一些搜索,如果我们只检查另一个表中是否存在数据而不是计数,则发现存在非常有用。是的,需要执行完整计数,但是,如果您可以保证QTY永远不会是负的,特别是如果它是通过检查约束强制执行的,那么您可以将查询从group by id(sumqty>=0)更改为where子句中的第二个谓词,并且QTY>0,那么只需要找到一个正的QTY记录。