アカウンティングテーブルからを削除し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