2013-07-17 55 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

等。

修復後,請告訴我是否可以