2013-07-17 57 views
0

好吧,所以我试图用最后2列在这里:每张票有一个与它关联的日记,可以有多个条目。我试图根据与条目相关的时间戳获取最新的条目,并创建一个查询,显示自上次条目以来经过了多长时间。最后一列也显示了经过时间,但对于特定类型的日记帐分录。 此查询中的条目需要被限制为拥有与2个人中的1个相对应的所有者ID的故障单。在这个例子中,这些人是'aaaa cccc'和'bbbb dddd'。所以,当我运行查询时,它只是挂起。另外,当我删除最后2列时,它仍然挂起,所以我认为它与where语句有关。我在这里亏本,但由于我对sql很陌生,可能有些简单的东西我错过了。oracle 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

我没有看到任何连接条件。你如何将这4张桌子连接在一起? –

+1

看来你正在做4个表格之间的笛卡儿连接。这可能会在你的'TEMP'表空间最终死亡之前将其吹掉。我假设有一些键可以让你把各种表中的数据联系在一起。你需要在'WHERE'子句中指定那些连接标准(或者转移到使用显式连接语法) –

+0

鉴于LIKE比较中没有通配符,你可以使用'='而不是LIKE。或者添加通配符,如'cont.first_name LIKE'%aaaa%'',如果您想查找FIRST_NAME包含字符'aaaa'的行。文档[此处](http://docs.oracle.com/html/A85397_01/operator.htm)。分享并享受。 –

回答

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

IN子句将为名为'aaaa dddd'和'bbbb cccc'的联系人选择ID,这是不可取的,但实际上不是OP挂起问题的原因。 – APC

+1

尽管我认为bbbb cccc先生是[布拉德伯里的火星编年史](https://en.wikipedia.org/wiki/The_Martian_Chronicles) – APC

+0

或aaaa cccc和bbbb dddd中的角色,不能离开那些可怜的家伙。 – dseibert

0

你在哪里链接你的表? 门票,customer_care_tickets,帐户和订单????? 在这一刻你已经实现了交叉连接(o笛卡尔产品)。 如果你想实现一个INNER JOIN,我建议你使用明确的表示法。 车票吨 JOIN CCT customer_care_tickets ON t.id = cct.fk_ticket

等。

修复后,请告诉我是否可以