我想在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'
感謝。
測試查詢樣本數據時,什麼是你預期的結果?您的查詢使用模式樣本中不存在的字段(狀態)。 –
感謝您的寶貴時間。 [編輯]:預期的結果將所有來自作業表的數據(如作業。*)不會發布。 發表在user_description = POST- {創建說明} 請讓我知道如果這不是清除你的疑問。 – chebus
您在示例中可以互換地使用'POST''POST1'和'POST2'。這很混亂。您能否將您期望的確切輸出添加到問題中? –