2014-11-08 4 views
1

У меня есть 3 стола, то есть клиент, кредит и оплата. Я хочу получить все платежи и кредиты, сделанные клиентом между @StartDate и @EndDate. Вот мой запрос:Левый Присоединиться с несколькими условиями

SELECT   Client.Name, Payment.PaymentAmount, Credit.CreditAmount 
FROM   Client 

LEFT JOIN Payment 
ON Client.ClientID = Payment.ClientID 
LEFT JOIN Credit 
ON Client.ClientID = Credit.ClientID 

WHERE  (Payment.Date BETWEEN @StartDate AND @EndDate) AND (Client.Date BETWEEN @StartDate AND @EndDate) 
ORDER BY Client.CName 

Я хочу, чтобы показать все кредиты, даже если платеж не сделал против него с кредитом и NULL для платежей, и наоборот. Но я не могу получить его, поскольку он показывает только клиента с кредитом и оплатой в эту дату.

Я пробовал ИЛИ вместо И (с «ГДЕ») Но это не работает.

ответ

2

Вы можете получить то, что вы хотите, перемещая условия в пункте on:

SELECT c.Name, p.PaymentAmount, cr.CreditAmount 
FROM Client c LEFT JOIN 
    Payment p 
    ON c.ClientID = p.ClientID AND p.Date BETWEEN @StartDate AND @EndDate LEFT JOIN 
    Credit cr 
    ON c.ClientID = cr.ClientID AND cr.Date BETWEEN @StartDate AND @EndDate 
ORDER BY c.CName; 

Однако, я не уверен, что это то, что вы действительно хотите, потому что это делает декартово произведение между платежами и кредитами, если в течение периода времени это более одного.

Это может быть то, что ближе к тому, что вы действительно хотите:

SELECT c.Name, p.PaymentAmount, NULL as CreditAmount 
FROM Client c LEFT JOIN 
    Payment p 
    ON c.client_id = p.ClientId AND p.Date BETWEEN @StartDate AND @EndDate 
UNION ALL 
SELECT c.Name, NULL, c.CreditAmount 
FROM Client c LEFT JOIN 
    Credit cr 
    ON c.ClientID = cr.ClientID AND cr.Date BETWEEN @StartDate AND @EndDate 
ORDER BY Name; 
+0

Благодаря человеку, который работал на меня. –

Смежные вопросы