簡體   English   中英

父子SQL查詢,按和排序

[英]Parent-child sql query with order by and limit

我有兩個這樣的表DOCUMENT和ATTRIBUTES

  • DOCUMENT(id)
  • ATTRIBUTE(name, value, doc_fk)

我需要運行一個類似於“抽象查詢”的查詢

select top 100 documents
where $state='COMPLETED'
order by $creationDate

其中$state$creationDate是兩個屬性。

請注意,限制是針對文檔而不是屬性,而排序和過濾器是針對兩個不同的屬性。 最終查詢應返回所有文檔屬性,而不僅僅是已過濾/排序的屬性。

我能夠通過一個非常復雜的查詢來編寫此代碼,並且正在尋找更好的選擇。 如果有用,我可以發布解決方案,但我不想指出可能錯誤的方向。

可以獲取少量的額外文檔,例如1000個而不是100個,並在內存中進行篩選/排序。 可以使限制不精確,例如74而不是所需的限制100,但不要太遠。

額外的“軟”要求:

  • 該查詢應與多個數據庫(oracle,mysql和sqlserver)一起使用,因此,除非所有平台都可用,否則應避免使用怪異的分析功能
  • 應該與JPA一起使用(eclipselink 2.4.0實現)

預期的輸出是這樣的

DOC_ID   ATTRIBUTE_NAME          VALUE
  123       state              COMPLETED
  123       creationDate       21/11/2012
  123       userid             someone
  456       state              COMPLETED
  ...

嗯,EAV設計的缺陷。

嘗試這個。

select 
   top 100
   document.* 

from document   
    inner join attribute astate on document.id = astate.doc_fk
          and astate.name='state'
          and astate.value = 'completed'
    inner join attribute acreation on document.id = acreation.doc_fk
            and acreation.name='creationdate'
order by cast(acreation.value as date)

但是,如果您堅持使用這種EAV結構,只會變得更加復雜。

(PS。MySQL不使用TOP,而是使用LIMIT)

SELECT doc_id, attr_name, attr_val, creationDate FROM 

   (
       SELECT * FROM (
          SELECT 
             doc.id as 'doc_id', attr.name as 'attr_name', null as 'attr_val', attr.value as 'creationDate'  
          FROM 
             ATTRIBUTE attr 
          LEFT JOIN 
             DOCUMENT doc ON attr.doc_fk = doc.id 
          WHERE 
             attr.name='creationDate' 
          ORDER BY creationDate desc;

       ) AS dt1


     UNION ALL


      SELECT * FROM( 
          SELECT 
             doc.id as 'doc_id', attr.name as 'attr_name', attr.value as 'attr_val', null as 'creationDate'  
          FROM 
             ATTRIBUTE attr 
          LEFT JOIN 
             DOCUMENT doc ON attr.doc_fk = doc.id;
      ) as dt2


   ) as dt0 GROUP BY doc_id ORDER by creationDate desc LIMIT 100;

派生表1(dt1)提供了所有日期屬性-允許按文檔的創建日期對結果進行排序。 派生表2為您提供了所有屬性。全部由“全部合並”在一起,使您可以按文檔分組,然后按創建日期排序。 希望這是正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM