2014-03-12 93 views
0

我想在informix/Postgres中構建一個SQL。需要關於編寫優化SQL查詢的建議

以下是表,以供參考

Job        JobType 
---------       -------------------- 
id,type_id,user_description   id,code,description 

實例數據,

 Job     JobType 
------------   --------------- 
    1,3,'ABC'   3,'CRT','CREATE' 
    2,4,'POST1-ABC'  4,'PST1','POST1' 
    3,3,'DEF'   5,'PST2','POST2' 
    4,5,'POST2-DEF' 
    5,3,'GHI' 
    6,4,'POST1-GHI' 

的要求是我需要獲取在工作表中的所有記錄中,其中作業不發佈尚未從而可以通過查看說明找到。

注意:發佈日期是指在這裏如果Job_表中的user_description附加了POST1 +' - '或POST2 +' - ',這意味着該作業已發佈。詳細說,我創建了ABC,當我發佈它時,ABC的帖子記錄的描述將是'POST1-ABC'。

USER_DESCRIPTION在工作表=(不等於)JobType PST1 +! ' - ' +用戶描述

我寫了下面的查詢來實現上述目標

SELECT p.* FROM Job p 
     JOIN JobType t1 ON (p.type_id = t1.id AND t1.code = 'CRT' AND LENGTH(p.user_description) > 0) 
     WHERE p.id NOT IN ( 
     select PARENT.id from (SELECT p.id,(select description FROM JobType WHERE code = 'PST1')||'-'||p.user_description PST1 
     ,(select description FROM JobType WHERE code = 'PST2')||'-'||p.user_description PST2 
    FROM Job p JOIN JobType t1 ON (p.type_id = t1.id AND t1.code = 'CRT' AND LENGTH(p.user_description) > 0) 
    ) PARENT , 
    ( SELECT c.id,c.user_description FROM Job c JOIN JobType t 
     ON (c.type_id = t.id AND (t.code = 'PST1' OR t.code = 'PST2') AND LENGTH(c.user_description) > 0) ORDER BY 2 
    ) 
    CHILD 
     where (PARENT.PST2 = CHILD.user_description or PARENT.PST1 = CHILD.user_description) 
    ) 

但是我會感激給你,如果你可以指導以更好的方式優化這個查詢。

編輯:

Assuming these are existing records in the table. 
      Job    
    ------------   
     1,3,'ABC'    
     2,4,'POST1-ABC'  
     3,3,'DEF'    
     4,5,'POST2-DEF' 
     5,3,'GHI' 
     6,4,'POST1-GHI' 
     7,3, 'XYZ' 
     8,3, 'ASD 

'

Expected OUTPUT : Records which are not posted 
     --------------------- 
      7,3,'XYZ' 
      8,3,'ASD' 

感謝。

+0

測試查詢樣本數據時,什麼是你預期的結果?您的查詢使用模式樣本中不存在的字段(狀態)。 –

+0

感謝您的寶貴時間。 [編輯]:預期的結果將所有來自作業表的數據(如作業。*)不會發布。 發表在user_description = POST- {創建說明} 請讓我知道如果這不是清除你的疑問。 – chebus

+0

您在示例中可以互換地使用'POST''POST1'和'POST2'。這很混亂。您能否將您期望的確切輸出添加到問題中? –

回答

1
SELECT j.* 
FROM Job AS j 
    JOIN JobType AS jt 
    ON jt.id = j.type_id 
WHERE jt.code = 'CRT' 
    AND NOT EXISTS 
     (SELECT 1 
     FROM Job AS p 
      JOIN JobType AS pjt 
      ON pjt.id = p.type_id 
     WHERE p.user_description = pjt.description || '-' || j.user_description 
      AND pjt.code LIKE 'PST%' 
    ) ; 

SQL-Fiddle

+0

感謝您的建議... – chebus

+0

ypercube:您的查詢很有用,但是我們將jobtype定義爲配置表,並且我們被告知不要硬編碼任何值..並且我正在考慮將jobtype加入到作業中(基於type_id),這樣如果稍後有任何改變到配置的值,我不需要再次回到這個sql .. – chebus

+0

在你的描述中你有*「job_description在Job表!=(不等於)JobType PST1 +' - '+用戶描述'*。如果沒有硬編碼,那麼帖子如何被確定爲帖子?如果'type_id'是3或4?如果'Jobtype.description'以''POST'開頭? –