Chr*_*own 2 database ms-access
我需要执行与此处所示完全相同的操作:INNER或LEFT将多个表记录连接到单个行但是它在MS Access查询中工作.
以下是场景:
电话表
+----------------+-------------+
| Field | Type |
+----------------+-------------+
| f_id | int(15) |
| f_client_id | int(11) |
| f_phone_type | varchar(50) |
| f_phone_number | varchar(13) |
+----------------+-------------+
Run Code Online (Sandbox Code Playgroud)
客户表
+-----------------------------+--------------+------+-----+
| 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 |
+-----------------------------+--------------+------+-----+
Run Code Online (Sandbox Code Playgroud)
使用标准的LEFT或INNER连接,我得到这样的结果:
+------------+------------+--------------+
| name | Phone Type | Phone Number |
+------------+------------+--------------+
| John Smith | Home | 712-555-6987 |
| John Smith | Work | 712-555-1236 |
+------------+------------+--------------+
Run Code Online (Sandbox Code Playgroud)
我需要一个查询,它将为我提供属于给定客户端的工作和家庭号码:
+------------+----------------+--------------+
| Name | Work Number | Home Number |
+------------+----------------+--------------+
| John Smith | 712-555-1236 | 712-555-6987 |
+------------+----------------+--------------+
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
但是,这不会转换为MS Access,加入失败.通过Access完成同样的事情的最佳方法是什么?
你还没有发现两个问题.
当连接两个以上的表时,Access'数据库引擎需要括号.通过使用查询设计器来设置连接,这是最简单的方法.查询设计者也会将LEFT JOIN替换为LEFT OUTER JOIN; 这两种方式都适用于Access 2003.
这个很容易在查询设计器中构建,但只返回具有home和work数字的客户端的行.我用它作为起点,后来调整了类似你原来的ON子句.
SELECT
c.f_first_name & " " & c.f_last_name AS [Name],
wp.f_phone_number AS [Work Number],
hp.f_phone_number AS [Home Number]
FROM
(Clients AS c
LEFT JOIN Phones AS hp
ON c.f_id = hp.f_client_id)
LEFT JOIN Phones AS wp
ON c.f_id = wp.f_client_id
WHERE
hp.f_phone_type='Home'
AND wp.f_phone_type='Work';
Run Code Online (Sandbox Code Playgroud)
将这些WHERE条件移动到ON表达式(如SQL Server示例中)将返回所有客户端,无论您是否有任何电话号码存档.但是,该方法将需要围绕ON表达式的括号.并且这些JOINS无法在查询设计器中显示.
SELECT
c.f_first_name & " " & c.f_last_name AS [Name],
wp.f_phone_number AS [Work Number],
hp.f_phone_number AS [Home Number]
FROM
(Clients AS c
LEFT JOIN Phones AS hp
ON (c.f_id = hp.f_client_id AND hp.f_phone_type='Home'))
LEFT JOIN Phones AS wp
ON (c.f_id = wp.f_client_id AND wp.f_phone_type='Work');
Run Code Online (Sandbox Code Playgroud)
更新:对于我自己,我宁愿用子查询来做这件事.
SELECT
c.f_first_name & " " & c.f_last_name AS [Name],
wp.f_phone_number AS [Work Number],
hp.f_phone_number AS [Home Number]
FROM
(Clients AS c
LEFT JOIN [
SELECT f_client_id, f_phone_number
FROM Phones
WHERE f_phone_type='Home'
]. AS hp
ON c.f_id = hp.f_client_id)
LEFT JOIN [
SELECT f_client_id, f_phone_number
FROM Phones
WHERE f_phone_type='Work'
]. AS wp
ON c.f_id = wp.f_client_id;
Run Code Online (Sandbox Code Playgroud)