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基づいてどのように選択するのですか?datePaidcustomerName

4

1 に答える 1

5

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

会計表:

  • idcustomerId外部キー参照Customers(Id)、、datePaidamount

次に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 
于 2012-09-18T10:32:54.030 に答える