2

我正在尝试从两个表、一个主表和一个事务表中提取记录。

我的Master表包含我所有的帐户 ID。我的transaction表有这些帐户运行的任何交易,包含 3 列:activity dateincomecharge type

transaction表格中,其中一些账户可能根本不会出现,因为它们在给定的日期范围内没有执行交易。但是,当我查询它们时,我仍然需要这些帐户出现在我的结果列表中。

所以我的数据看起来像这样:

     Master Table:                         Transaction Table:

    | AccountID  |              | AccountID | ChargeType | ActivityDate| Income |
    --------------              -------------------------------------------------
    |      1     |              |     2     |    2000    |  8/31/2012  | $99.00 |
    |      2     |              |     3     |    2000    |  7/31/2012  | $79.00 |
    |      3     |              |     5     |    2000    |  9/30/2012  | $79.00 |
    |      4     |
    |      5     |

我的查询目前看起来像:

select
    a.AccountID,
    b.ChargeType,
    b.ActivityDate,
    b.Income
From
    MasterTable as A
left join
    TransactionTable as B on a.AccountID = b.AccountID
where
    a.AccountID in ('1','2','3','4','5')
    and
    b.ActivityDate between '5/1/2012' and '11/30/2012'

据我了解,此查询应列出我选择的所有 5 个帐户,并显示NULL未在TransactionTable.

我期望的结果:

        | AccountID | ChargeType | ActivityDate| Income |
        -------------------------------------------------
        |     1     |    NULL    |     NULL    |  NULL  |
        |     2     |    2000    |  8/31/2012  | $99.00 |
        |     3     |    2000    |  7/31/2012  | $79.00 |
        |     4     |    NULL    |     NULL    |  NULL  | 
        |     5     |    2000    |  9/30/2012  | $79.00 |

我收到的结果不正确:

         | AccountID | ChargeType | ActivityDate| Income |
         -------------------------------------------------
         |     2     |    2000    |  8/31/2012  | $99.00 |
         |     3     |    2000    |  7/31/2012  | $79.00 |
         |     5     |    2000    |  9/30/2012  | $79.00 |

我想我在这里误解了一些基本的东西。任何帮助是极大的赞赏!

提前致谢!

4

4 回答 4

6

原因是您在where子句中引用了“b”表,因此过滤掉了 NULL 值。

将条件移至on子句:

From
    MasterTable A left join
    TransactionTable B
    on a.AccountID=b.AccountID and
       a.AccountID in ('1','2','3','4','5') and
       b.ActivityDate between '5/1/2012' and '11/30/2012'
于 2012-11-30T16:53:29.617 回答
1

将条款的最后一个过滤器更改WHERE为;SQL 小提琴示例

DECLARE @d1 DATETIME, @d2 DATETIME
SELECT @d1 = '5/1/2012', @d2 = '11/30/2012'


SELECT ...
WHERE a.AccountID in (1,2,3,4,5) AND
ISNULL(b.ActivityDate, @d1) BETWEEN @d1 and @d2
于 2012-11-30T16:55:10.513 回答
1

我会使用以下内容:

(b.ActivityDate is NULL or b.ActivityDate between '5/1/2012' and '11/30/2012' ) 

使原来的查询变成

 select
       a.AccountID,
       b.ChargeType,
       b.ActivityDate,
       b.Income
 From
       MasterTable as A
       left join
       TransactionTable as B on a.AccountID=b.AccountID
 where
       a.AccountID in ('1','2','3','4','5')
       and
       (b.ActivityDate is NULL or b.ActivityDate between '5/1/2012' and '11/30/2012' ) 

但下面的答案可能更好。

于 2012-11-30T17:01:10.450 回答
0

您可以简单地使用以下代码:

SELECT
    A.AccountID,
    B.ChargeType,
    B.ActivityDate,
    B.Income
From MasterTable AS A
LEFT JOIN  TransactionTable AS B 
ON A.AccountID = B.AccountID

如果您 B.ActivityDate BETWEEN '5/1/2012' AND '11/30/2012'在代码中使用条件,则它不会产生您期望的结果。因为对于AccountID = 1ActivityDateNULL。所以,记录与 AccountID = 1不会满足你之间的条件。

于 2012-12-04T07:50:52.797 回答