我需要做的完全相同的东西,如下所示:INNER or LEFT Joining Multiple Table Records Into A Single Row但它有一个MS Access查询。MS Access外部加入多个字段到单个记录
下面是场景:
电话表
+----------------+-------------+
| Field | Type |
+----------------+-------------+
| f_id | int(15) |
| f_client_id | int(11) |
| f_phone_type | varchar(50) |
| f_phone_number | varchar(13) |
+----------------+-------------+
客户表
+-----------------------------+--------------+------+-----+
| Field | Type | Null | Key |
+-----------------------------+--------------+------+-----+
| f_id | int(15) | NO | PRI |
| f_first_name | varchar(13) | YES | MUL |
| f_mi | char(1) | YES | |
| f_last_name | varchar(20) | NO | MUL |
+-----------------------------+--------------+------+-----+
使用标准LEFT或INNER JOIN ,我得到的是这样的:
+------------+------------+--------------+
| name | Phone Type | Phone Number |
+------------+------------+--------------+
| John Smith | Home | 712-555-6987 |
| John Smith | Work | 712-555-1236 |
+------------+------------+--------------+
我需要一个查询,这将使我属于一个给定的客户端的工作和家庭数字:
+------------+----------------+--------------+
| Name | Work Number | Home Number |
+------------+----------------+--------------+
| John Smith | 712-555-1236 | 712-555-6987 |
+------------+----------------+--------------+
解决方案在SQL中是
SELECT CONCAT(c.f_first_name, ' ', c.f_last_name) as Client_Name,
wp.f_phone_number as Work_Number,
hp.f_phone_number as Home_Number
FROM clients c
LEFT OUTER JOIN phone hp
ON hp.f_client_id = c.f_id
AND
hp.phone_type = 'home'
LEFT OUTER JOIN phone wp
ON wp.f_client_id = c.f_id
AND
wp.phone_type = 'work'
但是这并没有转化为MS Access,连接失败。通过Access完成同样的事情的最好方法是什么?
真棒,正是我需要的!我发现WHERE子句方法只返回两个电话号码的行,我甚至需要显示空白数字,所以我使用了第一种方法。我也切换到左外部连接,以确保所有记录被返回,它似乎在Access 2010中正常工作。 再次感谢! –
对,我在WHERE子句中犯了一个错误,它违背了LEFT JOIN的目的。另外,我对左外连接和左连接感到困惑。引擎确实接受LEFT OUTER JOIN,查询设计器将其转换为LEFT JOIN。我编辑了解决这些问题的答案,并添加了子查询方法。 – HansUp
在Jet/ACE的SQL方言中,LEFT OUTER JOIN是LEFT JOIN的同义词。我很确定它也适用于所有其他SQL方言。您可以键入额外的单词,但如果保存查询,Jet/ACE会将其删除并留下LEFT JOIN,因此根本无法输入。 –