2017-08-31 38 views
-1

我有兩個表:DocumentsDocumentAttributes帶兩個不在的SQL語句

  • Document有關列DocIDDelFlag
  • DocumentAttributesDocIDaIDaValue

現在我希望所有DocIDs和A-值有以下限制:

SELECT 
    [o1].[docid] 
    , [o1].[aValue] 
FROM [DocumentAttributes] [o1] 
WHERE [o1].[aID] = 9 
     AND [o1].[DocID] >= 2356 
     AND [o1].[DocID] < 90000000 
     AND [o1].[DocID] NOT IN 
     (
      SELECT 
      [o].[DocID] 
      FROM [DocumentAttributes] [o] 
      WHERE [o].[aID] = 2 
     ) 
    AND [o1].[DocID] IN 
     (
      SELECT 
      [d].[DocID] 
      FROM [DOCUMENTS] [d] 
      WHERE [d].[DELFLAG] != 2 
     ); 

所以我想所有的文件h ave否AttributeID = 2且未標記爲已刪除的屬性。

上面的SQL語句有效,但是由於我有大約1kk的文檔,每個文檔至少有10個屬性,所以速度太慢。

3選擇自己的成本不到1秒,所以「不在」是我猜的問題。

有沒有人有一個想法如何使它更快?

預先感謝來自

+0

有幾種技術,其中一些是RDBMS特有的,另一些則不是。有些想到的是「minus」或「except」關鍵字,「不存在」和「左連接」。 –

+0

標記您正在使用的dbms。 – jarlh

+0

它是一個oracle DB –

回答

0

子選擇「不」語句的每一行,多數民衆贊成你的事業中的一個執行,所以可能。

1

重新寫入not in作爲left join

select o1.docid, o1.aValue 
from DocumentAttributes o1 
left join DocumentAttributes o on o1.DocID = o.DocID and o.aID = 2 
where o1.aID = 9 and o1.DocID >= 2356 and o1.DocID < 90000000 
    and o.DocID is null 
and o1.DocID in (
    select d.DocID 
    from DOCUMENTS d 
    where d.DELFLAG != 2) 
0

Oracle支持的minus關鍵字。這意味着你可以取代這種東西

where myField not in (
select someField 
from etc 
) 

與這樣的事情。

where myField in (
select someField 
from wherever 
where they are available 
minus 
select someField 
from the same tables 
where I want to exclude them 
) 

我建議試試這個和左連接方法,看看哪個更好。