SQL外连接

时间:2011-09-13 00:33:26

标签: sql

我有3张桌子。下面的SQL应该解释我需要的一些数据:

SELECT m.FirstName, m.LastName, m.DOB, m.Gender, a.Address1, a.Address2, a.City, 
a.State, a.Country, a.PostCode from Members m 
LEFT JOIN Addresses a ON m.Id = a.MemberId 
INNER JOIN AddressType at ON at.Id = a.AddressTypeId 
WHERE m.Email = 'member2@test.com' AND at.Type = 'Account'

如果用户的成员中存在数据但地址中没有数据,我仍然需要返回FirstName,LastName等,但地址等为NULL。目前它全部回归为null。我以为我可以通过外部连接来做到这一点但是我已经尝试过并且不能让它拉回我需要的东西。我是在想完全错了还是做错了?是的,如果我做错了,如果你能告诉我什么以及怎么做,我会喜欢它。 :)

编辑:

我建议修改但是:

SELECT m.FirstName, m.LastName, m.DOB, m.Gender, a.Address1, a.Address2, a.City, 
a.State, a.Country, a.PostCode from Members m 
LEFT JOIN Addresses a ON m.Id = a.MemberId 
LEFT JOIN AddressType at ON at.Id = a.AddressTypeId 
WHERE m.Email = 'member2@test.com' AND at.Type = 'Account'

这不起作用。当我删除AddressType:

SELECT m.FirstName, m.LastName, m.DOB, m.Gender, a.Address1, a.Address2, a.City, 
a.State, a.Country, a.PostCode from Members m 
LEFT JOIN Addresses a ON m.Id = a.MemberId 
WHERE m.Email = 'member2@test.com' 

它会撤回数据,因此我知道第一个连接正在运行。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您需要在两个连接上使用LEFT JOIN。现在第一个连接按您的意愿运行,但是以下INNER JOIN尝试匹配at.Id = a.AddressTypeId上的NULL条件,但它不能,因此不返回该行

INNER JOIN只有在满足NULL条件时才会返回非空的非ON结果。

答案 1 :(得分:1)

尝试将INNER JOIN上的AddressType更改为LEFT JOIN,此时我认为INNER JOIN将强制执行两个表中存在的字段