2012-04-27 65 views
1

我有一個查詢,但工作,但需要永遠。我的「姓氏」列是3個選擇查詢。我知道必須有更好的方式來做到這一點。SQL效率 - 3嵌套選擇作爲列滯後

SELECT LOANS.BALANCE, TAXES.TAX_DUE, 
     (SELECT SBAOFFCR.LAST_NAME 
     FROM SBAOFFCR 
     WHERE SBAOFFCR.INITIALS = 
       (SELECT PMGTMAIN.OFFICER 
       FROM PMGTMAIN 
       WHERE PMGTMAIN.BOC_NUM_STRING = LOANS.BOC_NUM_STRING 
       AND PMGTMAIN.SEQ = 
        (SELECT MAX(SEQ) 
        FROM PMGTMAIN 
        WHERE PMGTMAIN.BOC_NUM_STRING 
              = LOANS.BOC_NUM_STRING))) AS LastName 

FROM LOANS 
LEFT JOIN TAXES 
ON LOANS.BOC_NUM_STRING = TAXES.BOC_NUM_STRING 
WHERE LOANS.BALANCE > 0 

PMGTMAIN具有用於LOANSTAXES每一個記錄數/多條記錄。
PMGTMAINOFFICER列員工intials可在SBAOFFCR表被引用爲INITIALS列和SBAOFFCR表中有一欄LAST_NAME這正是我需要爲每個記錄從LOANS/TAXES加入。
我不能只從PMGTMAIN WHERE LOANS.BOC_NUM_STRING = PMGTMAIN.BOC_NUM_STRINGOFFICER,它必須是MAX(PMGTMAIN.SEQ)。就像我說的,我的查詢很有用,但花了10分鐘。

+0

顯然你的貸款過度擴張,官員開始受到影響。 – Smandoli 2012-04-27 21:05:17

+1

我無法評論你的SQL,但我同意可能有一種簡化的方法。但是,如果您的鏈接字段尚未到位,則可以通過將索引應用於鏈接字段來縮短時間。 – Smandoli 2012-04-27 21:10:36

+1

用您正在使用的DBMS標記您的問題,並向我們提供您的SQL語句的執行計劃。此外,DDL將不勝感激,甚至更好:代表[SQL Fiddle](http://sqlfiddle.com/)。 – 2012-04-27 21:46:54

回答

1

恐怕我們通常需要更多的信息,爲什麼它需要這麼長時間,儘管我覺得創建索引(如果它們不存在的話)可能是您最好的選擇。

試試這個,雖然,以防萬一:

SELECT Loans.balance, COALESCE(Taxes.tax_due, 0), SbaOffcr.last_name 
FROM Loans 
LEFT JOIN Taxes 
ON Taxes.boc_num_string = Loans.boc_num_string 
JOIN Pmgtmain as Main 
ON Main.boc_num_string = Loans.boc_num_string 
LEFT JOIN Pmgtmain as Exclude 
ON Exclude.boc_num_string = Loans.boc_num_string 
AND Main.seq < Exclude.seq 
JOIN SbaOffcr 
ON SbaOffcr.initials = Pmgtmain.Officer 
WHERE Loans.balance > 0 
AND Exclude.boc_num_string IS NULL 

哦 - 爲什麼你的表/給出名稱的列?看起來大部分似乎會讓人困惑。有些東西暗示我的模式可能會被調整。

+0

+1用於重寫爲使用連接。雖然我懶得驗證邏輯。 – ulty4life 2012-04-27 23:33:10

+0

週一我會試試,謝謝!表名很短,因爲它是superbase(20歲的數據庫)。表模式被調整,但創建者是DBA的新手。我已經遷移到訪問(我會偏好SQL服務器,但不幸的是這不是卡) – DontFretBrett 2012-04-28 17:42:07

+0

我得到了「查詢表達式中的語法錯誤(缺少運算符):」/ – DontFretBrett 2012-04-30 17:19:59