我有三张桌子: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的标准,即使数据库中存在此组合,我也绝不会回来。是不是我想要左外连接点的行为?谢谢。
答案 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子查询创建单独的查询,但结果将(应该?)相同。