0

私には12の場所があり、それぞれが独自のデータベースを実行しています。各データベースはまったく同じように設定されており、独自の情報があります。データベースはすべてSQL2005または2008サーバーです。販売手数料を支払うための情報を取得するために、複数のテーブルクエリを作成しました。このクエリは12個のデータベースのうち10個で機能し、他の2個のデータベースは結果を返しません。2つの結合されたテーブル(2つのデータベースでは機能しません)を使用してクエリを実行すると、機能しますが、問題の他のテーブルは「where」ステートメントとは関係ありません。他のすべてのデータベースで機能する場合、2005年のサーバーデータベースの2つで機能しない理由を誰かが明らかにすることができますか?私のコードは次のとおりです。

SELECT        Customers.sBarcode AS Barcode, Customers.dtCreated AS Created, CustomerUnlimitedTransactions.sCreatedBy AS [Commission pays], 
                         Surcharges.sDescription AS [Unlimited Package], Surcharges.dblCommission AS [Commission Amount], Users.sUserName AS Greeter, @startdate AS Start_Date, 
                         @enddate AS End_Date
FROM            CustomerUnlimitedTransactions INNER JOIN
                         Customers ON CustomerUnlimitedTransactions.lCustomerId = Customers.lCustomerID INNER JOIN
                         VIPAccountTypes ON CustomerUnlimitedTransactions.lMonthlyAccountTypeId = VIPAccountTypes.lAccountType INNER JOIN
                         Surcharges ON VIPAccountTypes.lSurchargeId = Surcharges.Surcharge_ID INNER JOIN
                         Users ON Customers.lGreeterID = Users.ID_User
WHERE        (Customers.dtCreated BETWEEN CONVERT(DATETIME, @startdate, 102) AND CONVERT(DATETIME, @enddate, 102)) AND 
                         (CustomerUnlimitedTransactions.sTransactionType = N'sale') AND (CustomerUnlimitedTransactions.lMonthlyAccountTypeId = '11') OR
                         (Customers.dtCreated BETWEEN CONVERT(DATETIME, @startdate, 102) AND CONVERT(DATETIME, @enddate, 102)) AND 
                         (CustomerUnlimitedTransactions.sTransactionType = N'sale') AND (CustomerUnlimitedTransactions.lMonthlyAccountTypeId = '12')
ORDER BY Created

このようにクエリを実行しても、結果は返されません。

SELECT        Customers.sBarcode AS Barcode, Customers.dtCreated AS Created, CustomerUnlimitedTransactions.sCreatedBy AS [Commission pays], 
                             Surcharges.sDescription AS [Unlimited Package], Surcharges.dblCommission AS [Commission Amount], Users.sUserName AS Greeter, @startdate AS Start_Date, 
                             @enddate AS End_Date
    FROM            CustomerUnlimitedTransactions INNER JOIN
                             Customers ON CustomerUnlimitedTransactions.lCustomerId = Customers.lCustomerID INNER JOIN
                             VIPAccountTypes ON CustomerUnlimitedTransactions.lMonthlyAccountTypeId = VIPAccountTypes.lAccountType INNER JOIN
                             Surcharges ON VIPAccountTypes.lSurchargeId = Surcharges.Surcharge_ID INNER JOIN
                             Users ON Customers.lGreeterID = Users.ID_User
    WHERE        (Customers.dtCreated BETWEEN CONVERT(DATETIME, @startdate, 102) AND CONVERT(DATETIME, @enddate, 102))
    ORDER BY Created

このようにクエリを実行すると、結果が得られます。

SELECT        Customers.sBarcode AS Barcode, Customers.dtCreated AS Created, CustomerUnlimitedTransactions.sCreatedBy AS [Commission pays], 
                                 Surcharges.sDescription AS [Unlimited Package], Surcharges.dblCommission AS [Commission Amount], Users.sUserName AS Greeter, @startdate AS Start_Date, 
                                 @enddate AS End_Date
        FROM            CustomerUnlimitedTransactions INNER JOIN
                                 Customers ON CustomerUnlimitedTransactions.lCustomerId = Customers.lCustomerID 
        WHERE        (Customers.dtCreated BETWEEN CONVERT(DATETIME, @startdate, 102) AND CONVERT(DATETIME, @enddate, 102))
        ORDER BY Created

上記のクエリのいずれにも関連付けられているNullはありません。繰り返しますが、これは12の10で機能します...そしてはい、データベースはまったく同じです。(このクエリを1年の日付範囲で実行すると、結果が得られます)ただし、先週だけで25の結果を表示する必要があり、2つのそれぞれに何も表示していません。

4

2 に答える 2

0

データベースが実際に同一である場合(Tony Hopkinsonからのコメントを参照)、実行しているフィールドを調べて、JOINnull値があるかどうかを確認します。

于 2012-09-25T22:29:46.437 に答える
0

ヒント:INキーワードは、WHERE句に対して驚異的に機能します

WHERE Customers.dtCreated BETWEEN CONVERT(DATETIME, @startdate, 102)
                              AND CONVERT(DATETIME, @enddate, 102)
  AND CustomerUnlimitedTransactions.sTransactionType = N'sale'
  AND CustomerUnlimitedTransactions.lMonthlyAccountTypeId in ('11',12)

JOINの他のテーブルに影響を与えないWHERE句については、それらをINNERJOINからLEFTJOINに変更する必要があると思われます。

書かれているとおり(ヒント#2:賢明なエイリアスを自由に使用してください)

      FROM CustomerUnlimitedTransactions T
INNER JOIN Customers C ON T.lCustomerId = C.lCustomerID
INNER JOIN VIPAccountTypes V ON T.lMonthlyAccountTypeId = V.lAccountType
INNER JOIN Surcharges S ON V.lSurchargeId = S.Surcharge_ID
INNER JOIN Users U ON C.lGreeterID = U.ID_User

行が最終結果に表示されるためには、顧客は追加料金を伴うVIPアカウントタイプのトランザクションを少なくとも1つ持っている必要があり、挨拶されている必要があります(参加の読み取りが緩い)。JOINに沿ったヌルと行は消えます。

于 2012-09-25T23:09:28.707 に答える