アカウンティングテーブルからを削除しcustomerName、に置き換える必要がありCustomerIdます。ただし、今のところ、条件JOINとして任意の述語を使用して2つのテーブルを作成できます。たとえば、次のJOINようになります。
SELECT c.pNumber
FROM Customers c
INNER JOIN accounting ac ON c.fName + ', ' + p.lName = ac.customerName
テーブルAccouting構造の問題は、正規化されていない ことです。特に、次の3番目の正規形3NFを満たしていません。
3NF:キーに依存しない列を削除します
テーブルの列customerNameは、そのAccountingテーブルのアカウンティングに依存しませんid。したがって、テーブルは次のようになります。
顧客テーブル:
id、、、、。fName_ lName_pNumber
会計表:
id、customerId外部キー参照Customers(Id)、、datePaid。amount
次にJOIN、2つのテーブルを直接実行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