我有三个具有以下结构的表
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子句不匹配,则返回其余字段的空值?
移动你where p.Amount > 199的ON:
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,因为它在那里过滤结果,但仍然是"右"表中的数据,没有找到合适的行.
| 归档时间: |
|
| 查看次数: |
39 次 |
| 最近记录: |