我有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'
它会撤回数据,因此我知道第一个连接正在运行。有什么想法吗?
答案 0 :(得分:2)
您需要在两个连接上使用LEFT JOIN
。现在第一个连接按您的意愿运行,但是以下INNER JOIN
尝试匹配at.Id = a.AddressTypeId
上的NULL
条件,但它不能,因此不返回该行
INNER JOIN
只有在满足NULL
条件时才会返回非空的非ON
结果。
答案 1 :(得分:1)
尝试将INNER JOIN
上的AddressType
更改为LEFT JOIN
,此时我认为INNER JOIN
将强制执行两个表中存在的字段