簡體   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