2014-03-12 62 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'开头? –