0

シンプルな学術プロジェクト。簡単な手順。Payments テーブルに既に何かがある場合は、そのテーブルから負債の値を取得し、値がない場合は Tariff テーブルから取得します。しかし、なぜそのような条件が機能しないのでしょうか?

ALTER PROCEDURE dbo.GetDebt
    (
    @LoanId int
    )
AS

    IF NOT EXISTS (SELECT top 1 * FROM Payment WHERE LoanId = @LoanId) 
    BEGIN
        SELECT (TotalLoan + ( ( TotalLoan / 100 ) * Interest))  as Debt FROM Loan L, Tariff T
        WHERE L.TariffIf = L.TariffId
    END
    ELSE
    BEGIN
        SELECT MIN(Debt) as Debt FROM Loan L 
        RIGHT OUTER JOIN Payment P -- Joins are cool.
        ON L.LoanId = P.LoanId
        WHERE P.LoanId = @LoanId 
    END
4

2 に答える 2

3

If/Else はほとんどの場合、SQL コードに対する完全に間違ったアプローチです。テーブルについて詳しく知らずに正確な例を示すのは難しいですが、実際には次のようなものが必要です。

SELECT COALESCE(P.Debt, TotalLoan + ( ( TotalLoan / 100 ) * Interest))  as Debt
FROM Loan L
LEFT JOIN Tariff T ON T.LoanID = L.LoanID
LEFT JOIN (SELECT LoanID, Min(Debt) As Debt FROM Payment GROUP BY LoanID) P
WHERE L.LoanID = @LoanID

If/Else は必要ありません。

于 2012-12-19T22:46:34.757 に答える
3

use BEGIN and END around your statements like so:

IF (SELECT count(*) FROM Payment WHERE LoanId = @LoanId) = 0 
BEGIN

    SELECT (TotalLoan + ( ( TotalLoan / 100 ) * Interest))  as Debt FROM Loan L 
    RIGHT OUTER JOIN Tariff -- TODO: Add correct ON clause here
    WHERE L.LoanId = @LoanId

END
ELSE
BEGIN
    SELECT MIN(Debt) as Debt FROM Loan L 
    RIGHT OUTER JOIN Payment P -- Joins are cool.
    ON L.LoanId = P.LoanId
    WHERE P.LoanId = @LoanId 
END

Also note that you are missing an on clause for your right outer joins which will cause errors.

Also it might be more efficient to change

IF (SELECT count(*) FROM Payment WHERE LoanId = @LoanId) = 0 

to

IF NOT EXISTS (SELECT * FROM Payment WHERE LoanId = @LoanId)

The keyword being "might"

于 2012-12-19T22:33:34.247 に答える