oracle sql查询挂起

时间:2013-07-17 15:41:29

标签: sql oracle plsql

好吧,我正在尝试用这里的最后两列:每张票都有一个与之关联的日志,可以有多个条目。我试图获得最新的条目给定一个票号,并根据与该条目相关的时间戳,创建一个查询,显示自上次输入以来已经过了多少时间。最后一列也显示了已用时间,但是对于特定类型的日记帐分录。 此查询中的条目需要限制为拥有与2人中的1人相对应的所有者ID的故障单。在这个例子中,那些人是'aaaa cccc'和'bbbb dddd'。所以,当我运行查询时,它只是挂起。此外,当我删除最后2列时,它仍然会挂起,所以我认为它与where语句有关。我在这里不知所措,但由于我对sql很陌生,可能会有一些我想念的简单。

SELECT t.ticket_id, 
   cct.issue, 
   t.status, 
   t.priority, 
   a.account_name, 
   o.identifier, 
   To_char(t.created, 'MM/dd/yyyy hh:mm:ss')   AS  "CREATED", 
   To_char(SYSDATE - (SELECT Max(ti.timestamp) 
                      FROM   ticket_journal ti 
                      WHERE  ti.ticket_id = t.ticket_id), 'hh:mm:ss') AS "LAST_ENTRY", 
   To_char(SYSDATE - (SELECT Max(ti.timestamp) 
                      FROM   ticket_journal ti 
                      WHERE  ti.ticket_id = t.ticket_id 
                             AND ( ti.journal_type LIKE 'External' 
                                    OR ti.journal_type LIKE 'External/WIP' 
                                 )), 'hh:mm:ss')                   AS "LAST_EXT_ENTRY" 
FROM   tickets t, 
   customer_care_tickets cct, 
   accounts a, 
   orders o 
WHERE  t.owner IN (SELECT cont.contact_id 
                   FROM   contacts cont 
                   WHERE  ( cont.first_name LIKE 'aaaa' 
                          OR cont.first_name LIKE 'bbbb' ) 
                   AND ( cont.last_name LIKE 'cccc' 
                        OR cont.last_name LIKE 'dddd' )) 

2 个答案:

答案 0 :(得分:1)

看起来你可能在这里有笛卡尔联盟。 http://www.orafaq.com/wiki/Cartesian_join

我不确定您的数据库密钥究竟是如何构建的,所以我在下面猜到了,但它可能会让您了解如何链接表。这些是ANSI连接,而不是特定于Oracle的连接。我建议您学习使用这些类型的连接,以便您的代码更具可移植性。我希望这会有所帮助。

对于外连接,使用FULL JOIN进行内连接使用JOIN或INNER JOIN。对于左/右连接,请使用LEFT JOIN或RIGHT JOIN。

FROM tickets t
   JOIN customer_care_tickets cct ON t.ticket_id = cct.ticket_id
   JOIN accounts a ON cct.account_id = a.account_id
   JOIN orders o ON o.ticket_id = t.ticket_id
WHERE  t.owner IN (SELECT cont.contact_id 
                   FROM   contacts cont 
                   WHERE  ( cont.first_name LIKE 'aaaa' 
                          OR cont.first_name LIKE 'bbbb' ) 
                   AND ( cont.last_name LIKE 'cccc' 
                        OR cont.last_name LIKE 'dddd' )) 

答案 1 :(得分:0)

你在哪里链接你的表? 门票,customer_care_tickets,帐户和订单???? 在这一刻,您实现了交叉连接(笛卡尔产品)。 如果你想实现INNER JOIN,我建议你使用显式表示法。     门票     加入customer_care_tickets cct     ON t.id = cct.fk_ticket

等等。

完成此修复后,告诉我它是否正常