我想在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'。这很混乱。您能否将您期望的确切输出添加到问题中? –