我有一个场景,我需要跨三个表进行连接。
table #1 is a list of users table #2 contains users who have trait A table #3 contains users who have trait B
如果我想找到所有具有特征A或特征B的用户(在一个简单的sql中),我想我已经卡住了。
如果我定期加入,那么没有特质A的人将不会出现在结果集中,看他们是否有特质B(反之亦然)。 但是如果我从表1到表2和表3进行外部连接,那么我得到表1中的所有行,而不管我的where子句的其余部分是否指定了对表2或3的要求。
在你提出多个sqls和临时表以及诸如此类的东西之前,这个程序要复杂得多,这只是一个简单的例子。它基于许多外部因素动态创建sql,所以我试图让它在一个sql中工作。 我希望有一些in或exists的组合可以工作,但我希望有些简单。 但基本上外部联接将始终产生表1中的所有结果,是吗?
答案 0 :(得分:3)
SELECT *
FROM table1
LEFT OUTER
JOIN table2
ON ...
LEFT OUTER
JOIN table3
ON ...
WHERE NOT (table2.pk IS NULL AND table3.pk IS NULL)
或者如果你想偷偷摸摸:
WHERE COALESCE(table2.pk, table3.pk) IS NOT NULL
但是对于你的情况,我只是建议:
SELECT *
FROM table1
WHERE table1.pk IN (SELECT fk FROM table2)
OR table1.pk IN (SELECT fk FROM table3)
或可能更有效:
SELECT *
FROM table1
WHERE table1.pk IN (SELECT fk FROM table2 UNION (SELECT fk FROM table3)
答案 1 :(得分:2)
如果您真的只想要具有一个特征或另一个特征的用户列表,那么:
SELECT userid FROM users
WHERE userid IN (SELECT userid FROM trait_a UNION SELECT userid FROM trait_b)
特别是关于外连接,longneck的答案看起来就像我在写作中的那样。
答案 2 :(得分:1)
我想你可以在这里做一个UNION。
答案 3 :(得分:1)
我可以建议:
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table2)
UNION
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table3)
答案 4 :(得分:1)
这样的事情会起作用吗?请记住,根据表的大小,左外连接在性能方面可能非常昂贵。
Select *
from table1
where userid in (Select t.userid
From table1 t
left outer join table2 t2 on t1.userid=t2.userid and t2.AttributeA is not null
left outer join table3 t3 on t1.userid=t3.userid and t3.AttributeB is not null
group by t.userid)
答案 5 :(得分:1)
如果您想要的只是用户的ID,那么
SELECT UserId From Table2
UNION
SELECT UserId From Table3
完全足够了。
如果您希望这些用户使用Table1中的更多信息,您可以将上层SQL加入表1:
SELECT <list of columns from Table1>
FROM Table1 Join (
SELECT UserId From Table2
UNION
SELECT UserId From Table3) User on Table1.UserID = Users.UserID