所有父表行直接离开jon子表

时间:2016-03-07 23:09:18

标签: sql ms-access-2007 left-join where-clause

我有三张桌子:patron,patron_address和patron_phone 为每个赞助人/

Patron有1-3个Patron_address行 patron_address有0-4 我想显示顾客表中的所有行以及phone_type ='4'的所有电话号码。

但是,当我使用下面的查询时,我只会获得一个手机{类型为4的行,而不是所有的顾客行。

我试图让Access 2007查询设计器执​​行此操作,但有些事情是不合适的。 Patron_address行具有address_type。只有address_type 1的patron_address行才有子电话记录。

那么,无论他们是否拥有phone_type 1的patron_phone,我如何获得所有赞助人行?

SELECT 
    PATRON.patron_id, PATRON_PHONE.PHONE_TYPE,
    PATRON_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE
FROM 
    (PATRON 
INNER JOIN 
    PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID) 
LEFT JOIN 
    PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE.ADDRESS_ID
WHERE 
    (((PATRON_PHONE.PHONE_TYPE) = '4'))
ORDER BY 
    PATRON.patron_id;

如果我添加地址类型必须等于1的标准,即使数据库中存在此组合,我也绝不会回来。是不是我想要左外连接点的行为?谢谢。

1 个答案:

答案 0 :(得分:0)

Patron 表中的 INNER JOIN Patron_Addr 。这意味着两个表中必须存在匹配的记录(通过PATRON_ID)才能返回值。

for key, val in mylist:
   print key 
   print val

您从地址到表格都有 LEFT JOIN ,因此不需要匹配的电话号码。

由于您要过滤电话类型为4,因此它仅允许具有PHONE_TYPE = 4的电话记录的记录。

您的电话类型字段是数字还是文字? SQL Server将尝试来回转换它们,但其他人可能不会发出错误或只是不匹配 - 我不记得Access如何处理这种情况。

如果您删除了PHONE TYPE条件,则您的地址标准应该有效。

如果您想获取地址为1但仅包含TYPE = 4的电话号码的所有记录,请将WHERE PHONE_TYPE = 4更改为LEFT JOIN的一部分:

SELECT PATRON.patron_id, PATRON_PHONE.PHONE_TYPE, PATRON_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE 
FROM PATRON 
INNER JOIN PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID
LEFT JOIN PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE.ADDRESS_ID 
WHERE PATRON_PHONE.PHONE_TYPE = 4 
ORDER BY PATRON.patron_id 

访问SQL:

SELECT PATRON.patron_id, PATRON_PHONE.PHONE_TYPE, PATRON_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE 
FROM PATRON 
INNER JOIN PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID
LEFT JOIN PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE.ADDRESS_ID AND PATRON_PHONE.PHONE_TYPE = 4 
WHERE PATRON_PHONE.ADDRESS_TYPE = 1 
ORDER BY PATRON.patron_id 

Access对子查询有一些愚蠢的语法。您可以为P_Phone子查询创建单独的查询,但结果将(应该?)相同。