2

表客户

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

4

1 回答 1

5

您应该customerName从 Accounting 表中删除 ,并将其替换为CustomerId。但是,就目前而言,您可以JOIN使用任何谓词作为JOIN条件的两个表,如下所示:

SELECT c.pNumber
FROM Customers c
INNER JOIN accounting ac ON c.fName + ', ' + p.lName = ac.customerName

您的表Accouting结构的问题在于,它没有被 规范化,尤其是不符合第三范式3NF,即:

3NF:消除不依赖于键的列

表中的列不依赖于该customerName表的记帐。因此,您的表格应如下所示:Accountingid

客户表:

  • 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 
于 2012-09-18T10:32:54.030 回答