强制返回左连接的空值

use*_*260 1 sql sql-server

我有三个具有以下结构的表

CUSTOMER
OwnerID    | ProfileID (PK)| Name    | Surname    | Address
Owner1       Profile1       John      Brown        some address
Owner1       Profile2       John      Brown        some address
Owner1       Profile3       John      Brown        some address
Owner2       Profile4       Charles   Snow         some address
Owner2       Profile5       Charles   Snow         some address
Owner2       Profile6       Charles   Snow         some address
Owner3       Profile7       Edward    Glork        some address
Owner3       Profile8       Edward    Glork        some address

LOANS
LoanID (PK)| ProfileID    | Amount    | Duration
Loan1       Profile1       5000        31
Loan2       Profile2       1000        31
Loan3       Profile4       4000        31
Loan4       Profile4       10000       31
Loan5       Profile5       600         31
Loan6       Profile6       800         31

PAYMENTS
PaymentID (PK)| LoanID    | Amount    | Date
Payment1        Loan1       100         01-12-2017
Payment2        Loan1       100         01-14-2017
Payment3        Loan2       200         02-12-2017
Payment4        Loan2       300         02-15-2017
Payment5        Loan1       175         03-04-2017
Payment6        Loan2       235         03-04-2017
Payment7        Loan1       345         04-05-2017
Run Code Online (Sandbox Code Playgroud)

这里是SQL语句

SELECT 
c.OwnerID as ID,
c.ProfileID as Prof,
c.Name,
c.Surname,
l.Amount as Credit_Amount,
p.Amount as Debit_Amount,
p.Date as Debit_Date
from CUSTOMER c
left join LOANS l on l.ProfileID = c.ProfileID
left join PAYMENTS p on p.LoanID = l.LoanID
where p.Amount > 199
Run Code Online (Sandbox Code Playgroud)

我期望作为输出

ID    | Prof    | Name    | Surname    | Credit_Amount    | Debit_Amount    |Debit_Date
Owner1  Profile1  John      Brown        5000               null             null
Owner1  Profile1  John      Brown        5000               null             null
Owner1  Profile2  John      Brown        1000               200             02-12-2017
Owner1  Profile2  John      Brown        1000               300             02-15-2017
Owner1  Profile1  John      Brown        5000               null             null
Owner1  Profile2  John      Brown        1000               235             03-04-2017
Owner1  Profile1  John      Brown        5000               345             04-05-2017
Owner2  Profile4  Charles   Snow         4000               null             null
Owner2  Profile4  Charles   Snow         10000              null             null
Owner2  Profile6  Charles   Snow         800                null             null
Owner3  Profile7  Edward    Glork         null               null             null
Owner3  Profile8  Edward    Glork         null               null             null
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

ID    | Prof    | Name    | Surname    | Credit_Amount    | Debit_Amount    |Debit_Date
Owner1  Profile2  John      Brown        1000               200             02-12-2017
Owner1  Profile2  John      Brown        1000               300             02-15-2017
Owner1  Profile2  John      Brown        1000               235             03-04-2017
Owner1  Profile1  John      Brown        5000               345             04-05-2017
Run Code Online (Sandbox Code Playgroud)

那么,我究竟在SQL的逻辑中误解了什么呢?当我们使用左连接时,必须向右填充Aint null值?如何更正SQL语句以便获取CUSTOMERS表的所有记录,如果它们与WHERE子句不匹配,则返回其余字段的空值?

Lar*_*rnu 5

移动你where p.Amount > 199ON:

SELECT c.OwnerID AS ID,
       c.ProfileID AS Prof,
       c.Name,
       c.Surname,
       l.Amount AS Credit_Amount,
       p.Amount AS Debit_Amount,
       p.Date AS Debit_Date
FROM CUSTOMER c
     LEFT JOIN LOANS l ON l.ProfileID = c.ProfileID
     LEFT JOIN PAYMENTS p ON p.LoanID = l.LoanID
                         AND p.Amount > 199;
Run Code Online (Sandbox Code Playgroud)

当使用a引用表中的列时LEFT JOIN,除非处理空值,否则它将变为LEFT JOIN隐式INNER JOIN.相反,它更容易处理类似的子句ON,因为它在那里过滤结果,但仍然是"右"表中的数据,没有找到合适的行.