我的SQL数据库中有3个表,如下所示
Users2
UserID,
EID,
Name,
Email,
Department,
Enabled
Sites
SiteID,
SiteCode,
SiteName
UserSites2
UsersSitesID,
UserID,
SiteID
我需要做的是,在EID
和SiteID
的情况下,从Users2
表和SiteID
,SiteCode
和{获取一整行来自SiteName
表的{1}}当检索到的记录的Sites
在userID
预期结果的示例:
UserSites2
Users2
1, 12345, Me, me@email.com, Support, True
2, 12346, you, you@email.com, Service, True
Sites
1, 123, Regional HQ
2, 234, National HQ
UserSites2
所以给定1, 1, 1
2, 1, 2
3, 2, 2
EID
和12345
SiteID
我应该得到结果
2
以及1, 12345, Me, me@email.com, Support, True, 2, 234, National HQ
EID
和12346
SiteID
我什么都没得到
我知道如何加入1
和Users2
以获取我想要的完整行但我不明白如何使它取决于查找表中是否有条目。
答案 0 :(得分:1)
select u2.UserID, u2.EID, u2.Name, u2.Email, u2.Department, u2.Enabled,
s.SiteID, s.SiteCode, s.SiteName
from users2 u2
left outer join usersites us on u2.UserID = us.UserID
left outer join sites s on s.SiteID = us.SiteID
where u2.EID = 12345 and us.SiteID = 2
我测试了这个。如果未在UserSites中映射,它将不会给您任何记录。所以对于EID 12346和SiteID 1,你什么也得不到。
答案 1 :(得分:0)
select col1,col2,.....from Users, Sites, UserSites
where Users.eid = 12345 and Sites.siteid = 2
and users.user_id = userSites.userid
and sites.siteis = usersites.siteid
答案 2 :(得分:0)
我喜欢在可能的情况下专门列出联接。我相信这样的事情会奏效:
select u2.UserID, u2.EID, u2.Name, u2.Email, u2.Department, u2.Enabled,
s.SiteID, s.SiteCode, s.SiteName
from Users2 u2 join UserSites2 us2 on u2.UserID=us2.UserID
join sites s on us2.SiteID=s.SideID
where u2.EID=<eid> and
us2.SiteID=<siteid>
答案 3 :(得分:0)
我知道如何加入Users2和Sites以获得我想要的完整行,但我不明白如何使它依赖于查找表中有一个条目。
使用LEFT JOIN意味着可能没有基于连接条件的支持记录。如果缺少记录,您将在适当的列中看到null。如果您只想根据条件返回行,请使用[INNER] JOIN。这是一个good link,显示了JOIN之间的差异,它包括UNION。
这是您的查询:
SELECT u.userid,
u.eid,
u.name,
u.email,
u.department,
u.enabled,
s.siteid,
s.sitecode,
s.sitename
FROM USERS2 u
JOIN USERSITES2 us ON us.userid = u.userid
JOIN SITES s ON s.siteid = us.siteid
WHERE u.eid = ?
AND us.siteid = ?