1

機能するクエリがありますが、永遠にかかります。私の「LastName」列は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内の 1 つのレコードごとに複数/多数のレコードがありTAXESます。テーブルで列として参照できる
PMGTMAIN列に従業員のイニシャルがあり、テーブルには、結合からの各レコードに必要な列があります。そして、から だけを取得することはできません。を持つものでなければなりません。先ほど言ったように、クエリは機能しますが、10 分ほどかかりました。OFFICERSBAOFFCRINITIALSSBAOFFCRLAST_NAMELOANS/TAXES
OFFICERPMGTMAIN WHERE LOANS.BOC_NUM_STRING = PMGTMAIN.BOC_NUM_STRINGMAX(PMGTMAIN.SEQ)

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 に答える