表客户
id fName lName pNumber
1 Adeline Brown 55512300
2 May Green 55512094
表会计
id customerName datePaid amount
1 Brown, Adeline 2012-08-09 210
2 Green, May 2012-09-09 430
我的问题是如何根据与pNumber
对应的datePaid
选择customerName
?
答案 0 :(得分:5)
您应从Accounting表中删除customerName
,并将其替换为CustomerId
。但是,就目前而言,您可以使用任何谓词JOIN
JOIN
两个表作为SELECT c.pNumber
FROM Customers c
INNER JOIN accounting ac ON c.fName + ', ' + p.lName = ac.customerName
条件,如下所示:
Accouting
您的表customerName
结构的问题在于,不是 normalized,尤其是,不符合第三种正常形式 3NF 即:
3NF:消除不依赖于密钥的列
Accounting
表中的列id
不依赖于该表的会计id
。所以,你的表应该是这样的:
客户表:
fName
,lName
,pNumber
,id
。会计表:
customerId
,Customers(Id)
外键引用datePaid
,amount
,JOIN
。然后你可以ON customerId
直接SELECT c.pNumber
FROM Customers c
INNER JOIN accounting ac ON c.Id = ac.CustomerId
两个表SELECT c.pNumber
FROM customers c
INNER JOIN
(
SELECT DISTINCT id, customerName, datePaid, amount
TO_DAYS(DATE(datePaid)) - TO_DAYS(CURDATE()) AS DaysFromPayment
FROM Accounting
) ac ON c.last_name + ', ' + c.first_name = ac.customerName
WHERE ac.DaysFromPayment = 30
,这将极大地提高性能:
{{1}}
修改:查询中没有任何错误。可能是您没有符合此条件的任何行。您可以尝试以下查询,它与您编写的内容相同,但更有条理:
{{1}}