1

1つのフィールドで結合しようとする2つのテーブルがあり、同じ結果が得られるはずの2つのクエリで異なる結果が得られます。クエリは次のとおりです。

SELECT * FROM tblCustomer tca
WHERE tca.PhoneNumber IN(
    SELECT ts.SubscriptionNumber FROM sub.tblSubscription ts
    WHERE ts.ServiceTypeID=4
    AND ts.SourceID=-1
)

SELECT tca.*
FROM   sub.tblSubscription ts
       inner JOIN tblCustomer tca
            ON  ts.SubscriptionNumber = tca.PhoneNumber
WHERE  ts.ServiceTypeID = 4
       AND ts.SourceID = -1

これはどのように可能ですか?

4

1 に答える 1

3

顧客は複数のサブスクリプションを持つことができると思いますよね? 5 人の顧客がいて、それぞれが 2 つのサブスクリプションを持っているとします...

SELECT ... FROM Customer WHERE IN (Subscription) を実行すると、5 つの顧客レコードを受け取ります。これは、サブスクリプション テーブルに 10 レコードが含まれる場合でも、5 人の顧客のそれぞれが実際にはサブスクリプション テーブルに含まれているためです。本質的に、あるテーブルのデータをデータベースに要求していて、そのフィールドの 1 つの値が別のテーブルに存在します。したがって、WHERE IN テーブルのデータ量に関係なく、FROM テーブルの個別のレコードのみが返されます。

一方、Customer テーブルとサブスクリプション テーブルを INNER JOIN すると、5 人の顧客 x 各サブスクリプション 2 = 10 レコードが返されます。テーブルを結合することにより、各テーブルのすべてのデータをデータベースに要求し、データが特定のフィールドと照合されます。

そうです、2つのクエリは間違いなく異なる結果をもたらします。

于 2013-01-31T11:36:42.880 に答える