1

我有一个有效但需要永远的查询。我的“姓氏”列是 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

PMGTMAINLOANSAND中的每一条记录都有几条/多条记录TAXES
PMGTMAIN列中有员工姓名缩写OFFICER,可以在SBAOFFCR表中作为列引用,INITIALS并且在SBAOFFCR表中有一个列LAST_NAME,这是我从联接中的每条记录所需要的LOANS/TAXES
而且我不能OFFICER从中获取任何PMGTMAIN WHERE LOANS.BOC_NUM_STRING = PMGTMAIN.BOC_NUM_STRING东西,它必须是带有 的那个MAX(PMGTMAIN.SEQ)。就像我说的,我的查询有效,但花了大约 10 分钟。

4

1 回答 1

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

哦 - 为什么你的表/列被命名为名称?它似乎主要是令人困惑的。有些东西向我暗示,您的架构可能会被调整。

于 2012-04-27T21:41:18.093 回答