繁体   English   中英

在SQL选择查询中需要帮助

[英]Need help in SQL Select Query

需要有关此查询的帮助,我只想知道我在做什么,还是需要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 A_id from TableA 
                         where (A_id in (1, 2, 3, 4) 
                           and flag = 'N') 
             group by A_id 
             having sum(qty) > 0)
    )

TableA和TableB之间的关系是一对多的

条件或逻辑:

  • 如果该标志为真,则无需进一步检查即可选择数据
  • 如果该标志为假,我们必须参考TableB来查看qty列的总和是否大于0

您的方法确实太复杂了。 从A中选择标志= 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
)

您提出的查询没有什么大不了的,但是可以进行改进。 如果将Flag ='N'的测试移到TableA的第一选择中,并将TableB的选择与TableA的第一选择相关联,则可以省去TableA的第二选择:

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))
    );

这将消除对TableA的额外查询,以获取应该已经知道的信息。 其次,由于TableA.A_Id现在与TableB.A_Id相关联,因此A_Id in (...)A_Id in (...)可以更改为A_Id in (...)子句:

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%,因此性能提高可能会非常明显。

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

在示例中:

DELIMITER $$

CREATE FUNCTION flaggedSelection ( my_flag varchar(1) )
RETURNS varchar(255) -- TODO: change to appropriate output

BEGIN

DECLARE return_value varchar(255); -- TODO: change to appropriate output

IF flag = 'Y'
THEN
  -- Performe select without further checks
  -- return_value = QUERY;
ELSE
  -- Refer TableB to see if sum of the qty column is greater than 0
  -- return_value = QUERY;
END IF;

RETURN return_value;

END; $$

DELIMITER;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM