2016-07-29 76 views
2

我有三个表:如何获得左连接或完全连接?

Customers表:

+------------------+------------+------------+ 
|  Customer  | Start Date | End Date | 
+------------------+------------+------------+ 
| Cantrell, Beck | 02/13/2016 | 12/22/2016 | 
| Frazier, Urielle | 11/13/2015 | 01/03/2017 | 
| Frost, Kato  | 05/27/2016 | 09/17/2016 | 
| Larsen, Kuame | 10/27/2015 | 08/09/2016 | 
| Jennings, Echo | 12/14/2015 | 03/09/2017 | 
+------------------+------------+------------+ 

付款表:

+------------------+------------+------------+ 
|  Customer  | Date | Amount | 
+------------------+------------+------------+ 
| Frost, Kato  | 05/27/2016 | 180.00  | 
| Frost, Kato  | 06/06/2016 | 20.00  | 
| Frost, Kato  | 06/07/2016 | 40.00  | 
| Frost, Kato  | 06/13/2016 | 100.00  | 
| Frost, Kato  | 06/20/2016 | 40.00  | 
| Frost, Kato  | 06/27/2016 | 80.00  | 
| Frost, Kato  | 07/05/2016 | 60.00  | 
| Frost, Kato  | 07/12/2016 | 40.00  | 
+------------------+------------+------------+ 

我也有第三个表,日期,这仅仅是从1开始日期列表/ 1/2010至1/1/2020。

客户在每周的开始日期当天到期。为了得到每个客户收费的项目的全部名单,我创建了以下查询:

SELECT Dates.Date, 
IIf([Dates].[date]=[Customers].[Start Date],177,77) AS Accrued 
FROM Customers, Dates 
WHERE (((Customers.[Start Date])<=[date]) 
    And ((Customers.[End Date])>=[date]) 
    AND ((Weekday(Dates.date))=Weekday(Customers.[Start Date])) 
    And ((Customers.Customer)=[Which Customer?])); 

产生这样的结果:

+--------------------+--------------------+ 
|  Date  |  Accrued  | 
+--------------------+--------------------+ 
|   5/27/2016 |    177 | 
|   6/3/2016 |     77 | 
|   6/10/2016 |     77 | 
|   6/17/2016 |     77 | 
|   6/24/2016 |     77 | 
|   7/1/2016 |     77 | 
|   7/8/2016 |     77 | 
|   7/15/2016 |     77 | 
|   7/22/2016 |     77 | 
|   7/29/2016 |     77 | 
|   8/5/2016 |     77 | 
|   8/12/2016 |     77 | 
|   8/19/2016 |     77 | 
|   8/26/2016 |     77 | 
|   9/2/2016 |     77 | 
|   9/9/2016 |     77 | 
|   9/16/2016 |     77 | 
+--------------------+--------------------+ 

现在,我需要在所有的添加自己目前的付款,所以我添加了付款表。

[由客户收费]查询:

SELECT Dates.Date, 
     IIf([Dates].[date]=[Customers].[Start Date],177,77) AS Accrued, 
     Payments.Date, 
     Payments.Amount 
FROM Dates, 
    Customers INNER JOIN Payments ON Customers.Customer = Payments.Customer 
WHERE (((Customers.[Start Date])<=[Dates].[date]) 
    AND ((Customers.[End Date])>=[Dates].[date]) 
    AND ((Weekday([Dates].[date]))=Weekday([Customers].[Start Date])) 
    AND ((Customers.Customer)=[Which Customer?])); 

这样做的结果是每个计提重复每笔付款的列表。我想调整JOIN以查看是否可以仅将Accrued限制为一次,但每次尝试时,都会收到错误消息,指出存在模糊的外连接。

因此,我尝试将它分成两个查询,然后将它们连接在一起。

[由客户付款]查询:

SELECT Payments.Date, Payments.Amount, Customers.Customer 
FROM Customers LEFT JOIN Payments ON Customers.Customer = Payments.Customer 
WHERE (((Customers.Customer)=[Which Customer?])); 

其产生如下结果:

+--------------------+--------------------+ 
|  Date  |  Amount  | 
+--------------------+--------------------+ 
|   05/27/2016 |    180.00 | 
|   06/06/2016 |    20.00 | 
|   06/07/2016 |    40.00 | 
|   06/13/2016 |    100.00 | 
|   06/20/2016 |    40.00 | 
|   06/27/2016 |    80.00 | 
|   07/05/2016 |    60.00 | 
|   07/12/2016 |    40.00 | 
+--------------------+--------------------+ 

我然后试图做一个FULL OUTER JOIN,但看完后左右,它不看起来像Access支持他们。我找到了一些使用UNION来解决它的例子。

SELECT [Charges by Customer].Date, [Charges by Customer].Accrued, [Payments by Customer].Date, [Payments by Customer].Amount 
    FROM [Charges by Customer] LEFT JOIN [Payments by Customer] ON [Charges by Customer].Customer = [Payments by Customer].Customer 
UNION 
SELECT [Payments by Customer].Date, [Payments by Customer].Amount, [Payments by Customer].Date, [Payments by Customer].Amount 
    FROM [Payments by Customer] LEFT JOIN [Charges by Customer] ON [Payments by Customer].Customer = [Charges by Customer].Customer 

经过一段时间的摆弄之后,我很困惑,不知道该从哪里开始。我有点迷路了Access。我对MySQL更加熟悉,差异(和UI)让我很难将自己的头脑放在需要做的事情上来获得我想要的结果。

我理想中的结果会是这样的:

+-----------+---------+------------+--------+ 
| Date  | Accrued | Date | Amount | 
+-----------+---------+------------+--------+ 
| 5/27/2016 |  177 | 05/27/2016 | 180.00 | 
| 6/3/2016 |  77 |   |  | 
|   |   | 06/06/2016 | 20.00 | 
|   |   | 06/07/2016 | 40.00 | 
| 6/10/2016 |  77 |   |  | 
|   |   | 06/13/2016 | 100.00 | 
| 6/17/2016 |  77 |   |  | 
|   |   | 06/20/2016 | 40.00 | 
| 6/24/2016 |  77 |   |  | 
|   |   | 06/27/2016 | 80.00 | 
| 7/1/2016 |  77 |   |  | 
|   |   | 07/05/2016 | 60.00 | 
| 7/8/2016 |  77 |   |  | 
|   |   | 07/12/2016 | 40.00 | 
| 7/15/2016 |  77 |   |  | 
| 7/22/2016 |  77 |   |  | 
| 7/29/2016 |  77 |   |  | 
| 8/5/2016 |  77 |   |  | 
| 8/12/2016 |  77 |   |  | 
| 8/19/2016 |  77 |   |  | 
| 8/26/2016 |  77 |   |  | 
| 9/2/2016 |  77 |   |  | 
| 9/9/2016 |  77 |   |  | 
| 9/16/2016 |  77 |   |  | 
+-----------+---------+------------+--------+ 

如果您有任何意见或解决方案,我会非常感激。谢谢!

+0

对我的答案有什么想法? – objectNotFound

回答

0

有几个问题你的方法

  1. 查询[由客户收费]缺少列客户

[由客户收费]

SELECT Customers.Customer, 
     Dates.Date, 
     IIf([Dates].[date]=[Customers].[Start Date],177,77) AS Accrued 
FROM Customers, Dates 
WHERE (((Customers.[Start Date])<=[date]) 
    And ((Customers.[End Date])>=[date]) 
    AND ((Weekday([Dates].[date]))=Weekday([Customers].[Start Date])) 
    And ((Customers.Customer)='Frost, Kato')) 
  • 您需要一个Right Join和Left Join的联盟,然后按日期排序才能得到如下最终结果:
  • SELECT a.Customer, a.Date1, a.Accrued, a.Date2, a.Amount FROM ( select NZ(C.Customer,P.Customer) as Customer, NZ(C.Date, P.Date) as Date1, C.Accrued, P.Amount, P.Date as Date2 from [Charges by Customer] C RIGHT OUTER JOIN [Payments by Customer] P ON C.Customer = P.Customer and P.Date = C.Date UNION select C.Customer, C.Date, C.Accrued, P.Amount, P.Date as Date2 from
    [Charges by Customer] C LEFT OUTER JOIN [Payments by Customer] P ON C.Customer = P.Customer and P.Date = C.Date ) a Order by Date1

  • 还与联盟您的查询缺少的连接,通过日期(and P.Date = C.Date)加入条件。您只需加入“客户”栏目[Charges by Customer].Customer and [Payments by Customer].Customer
  • 让我知道您是否需要任何说明。

    +0

    感谢您的回复。我现在正在度假,并没有机会对它进行测试。我会继续给你,让他们不会过期。 – NicholasJohn16

    +0

    @ NicholasJohn16谢谢...让我知道它是否真的有效...大声笑 – objectNotFound

    +0

    工作很好。谢谢。 – NicholasJohn16