我有三个表:如何获得左连接或完全连接?
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 | | |
+-----------+---------+------------+--------+
如果您有任何意见或解决方案,我会非常感激。谢谢!
对我的答案有什么想法? – objectNotFound