0

我有 12 个位置,每个位置都运行自己的数据库。每个数据库的设置完全相同,都有自己的信息。数据库都是SQL2005或2008服务器。我编写了一个多表查询来获取支付销售佣金的信息。此查询适用于 12 个数据库中的 10 个,其他 2 个数据库不返回任何结果。如果我使用 2 个连接表运行查询(在 2 个数据库上它不起作用)它可以工作,但是其他有问题的表与“where”语句无关。如果它适用于所有其他数据库,任何人都可以解释为什么它不能在 2005 服务器数据库中运行吗?我的代码是:

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 个......是的,数据库完全相同。(如果我在一年的日期范围内运行此查询,我会得到结果)但是我应该仅显示上周的 25 个结果,而我在 2 个中都没有显示任何结果。

4

2 回答 2

0

如果数据库实际上是相同的(请参阅 Tony Hopkinson 的评论),则查看您正在执行的字段JOIN以查看是否有任何空值。

于 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)

至于 WHERE 子句不会影响 JOIN 中的其他表,我高度怀疑您需要将它们从 INNER JOIN 转换为 LEFT JOIN。

如所写(提示#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 帐户类型的交易,并且他必须受到欢迎(松散阅读加入)。JOIN 上的任何空值和行都会消失。

于 2012-09-25T23:09:28.707 回答